home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / clang / wndwc20.zip / WNDWC20.DOC < prev    next >
Text File  |  1989-03-06  |  97KB  |  2,484 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.                            MULTI-LEVEL VIRTUAL WINDOWS
  21.                                   USER'S GUIDE
  22.  
  23.                                    Version 2.0
  24.                                 February 1, 1989
  25.  
  26.  
  27.                             Conversion to Turbo C by
  28.                        Jordan Gallagher / Wisdom Research
  29.  
  30.  
  31.                   Copyright (C) 1989 Eagle Performance Software
  32.                               All Rights Reserved.
  33.  
  34.  
  35.  
  36.                                _______
  37.                           ____|__     |               (tm)
  38.                        --|       |    |-------------------
  39.                          |   ____|__  |  Association of
  40.                          |  |       |_|  Shareware
  41.                          |__|   o   |    Professionals
  42.                        -----|   |   |---------------------
  43.                             |___|___|    MEMBER
  44.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  45.  
  46.  
  47.  
  48.                        T A B L E   O F   C O N T E N T S
  49.  
  50.         1. INTRODUCTION  . . . . . . . . . . . . . . . . . . . . . 4
  51.              Features  . . . . . . . . . . . . . . . . . . . . . . 4
  52.              Using the Manuals . . . . . . . . . . . . . . . . . . 4
  53.              Licensing . . . . . . . . . . . . . . . . . . . . . . 5
  54.              Customer Service  . . . . . . . . . . . . . . . . . . 5
  55.              ASP . . . . . . . . . . . . . . . . . . . . . . . . . 6
  56.  
  57.         2. GETTING STARTED . . . . . . . . . . . . . . . . . . . . 7
  58.              Distribution Files  . . . . . . . . . . . . . . . . . 7
  59.              Demonstration . . . . . . . . . . . . . . . . . . . . 7
  60.  
  61.         3. PROGRAMMING WINDOWS . . . . . . . . . . . . . . . . . . 8
  62.              Basic Programming . . . . . . . . . . . . . . . . . . 8
  63.              Window Definitions  . . . . . . . . . . . . . . . . . 10
  64.              Basic Routines  . . . . . . . . . . . . . . . . . . . 10
  65.              makewindow Parameters . . . . . . . . . . . . . . . . 11
  66.              Window Modes  . . . . . . . . . . . . . . . . . . . . 12
  67.                Defaults  . . . . . . . . . . . . . . . . . . . . . 12
  68.                setwindowmodes  . . . . . . . . . . . . . . . . . . 13
  69.                List of Modes . . . . . . . . . . . . . . . . . . . 13
  70.                Shadows . . . . . . . . . . . . . . . . . . . . . . 13
  71.                ZOOMMODE  . . . . . . . . . . . . . . . . . . . . . 13
  72.                RELMODE . . . . . . . . . . . . . . . . . . . . . . 13
  73.                PERMMODE  . . . . . . . . . . . . . . . . . . . . . 14
  74.                SEETHRUMODE . . . . . . . . . . . . . . . . . . . . 15
  75.                HIDDENMODE  . . . . . . . . . . . . . . . . . . . . 15
  76.                VIRTUALMODE . . . . . . . . . . . . . . . . . . . . 16
  77.              Cursor Modes  . . . . . . . . . . . . . . . . . . . . 17
  78.  
  79.         4. WRITING TO WINDOWS  . . . . . . . . . . . . . . . . . . 19
  80.              Direct Writing  . . . . . . . . . . . . . . . . . . . 19
  81.              Cursor and EOS Positioning  . . . . . . . . . . . . . 19
  82.              Clearing  . . . . . . . . . . . . . . . . . . . . . . 20
  83.              Scrolling . . . . . . . . . . . . . . . . . . . . . . 21
  84.              Line Drawing  . . . . . . . . . . . . . . . . . . . . 22
  85.              Custom Routines . . . . . . . . . . . . . . . . . . . 23
  86.  
  87.         5. VIRTUAL WINDOWS . . . . . . . . . . . . . . . . . . . . 25
  88.              Application . . . . . . . . . . . . . . . . . . . . . 25
  89.              Programming . . . . . . . . . . . . . . . . . . . . . 25
  90.  
  91.         6. WINDOW MANAGEMENT . . . . . . . . . . . . . . . . . . . 29
  92.              Access Methods  . . . . . . . . . . . . . . . . . . . 29
  93.              Display Control . . . . . . . . . . . . . . . . . . . 29
  94.              Write Control . . . . . . . . . . . . . . . . . . . . 30
  95.              Window Modes and Flags  . . . . . . . . . . . . . . . 31
  96.              High Speed Screen Design  . . . . . . . . . . . . . . 31
  97.              Multiple Video Pages  . . . . . . . . . . . . . . . . 32
  98.              Multi-tasking Environments  . . . . . . . . . . . . . 32
  99.  
  100.  
  101.  
  102.  
  103.  
  104.                                        2
  105.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  106.  
  107.  
  108.         7. DATA MANAGEMENT . . . . . . . . . . . . . . . . . . . . 34
  109.              Data Allocation . . . . . . . . . . . . . . . . . . . 34
  110.              Structure Handling  . . . . . . . . . . . . . . . . . 34
  111.  
  112.         8. OTHER MODULES . . . . . . . . . . . . . . . . . . . . . 37
  113.              GOOF Module . . . . . . . . . . . . . . . . . . . . . 37
  114.              Utility modules . . . . . . . . . . . . . . . . . . . 37
  115.  
  116.         9. COMPILING THE SOURCE CODE . . . . . . . . . . . . . . . 38
  117.  
  118.         APPENDIX A: Application Products . . . . . . . . . . . . . 39
  119.  
  120.         APPENDIX B: Credits  . . . . . . . . . . . . . . . . . . . 41
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138.  
  139.  
  140.  
  141.  
  142.  
  143.  
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.                                        3
  166.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  167.  
  168.  
  169.    1.  I N T R O D U C T I O N
  170.  
  171.  
  172.    FEATURES
  173.  
  174.    Welcome to WNDWC multi-level virtual windows!
  175.  
  176.    You have just obtained a copy of the highest performance window utilities
  177.    available today for Turbo C 2.0 (TC2) and Turbo Assembler.  Both novice and
  178.    professional programmers will appreciate these simple and very powerful
  179.    utilities that give you full window control and management in all text
  180.    modes.
  181.  
  182.    Here are some of the features you will discover:
  183.  
  184.      . Uses the powerful direct screen writing routines of
  185.        QWIKC20.
  186.      . Up to 254 fixed or virtual windows can be on the screen at
  187.        one time.
  188.      . Extremely high-speed virtual screens in RAM.
  189.      . Virtual windows are fully updated even if covered!
  190.      . Virtual windows have virtual titles.
  191.      . Fully supported hidden windows saved in RAM.
  192.      . Fully supports all video pages.
  193.      . Adjustable-rate moving, resizing, and scrolling.
  194.      . All windows can be randomly accessed.
  195.      . 28 window-relative writing routines.
  196.      . 15 different border styles with shadows.
  197.      . Full line drawing functions.
  198.      . Full cursor mode control for each window.
  199.      . Writes in all text modes and column modes.
  200. |    . Writes direct to multi-tasking video buffers (MTVB).
  201.      . Only 13k bytes of code if all 69 utilities are used.
  202.      . Used in all other Eagle products.
  203.  
  204.    WNDWC is a very high performance window library with high speed and tight
  205.    code.  All types of windows, including fixed or virtual, hidden or shown,
  206.    work compatibly in the same package.  With WNDWC, you can choose the abso-
  207.    lute writing routines of QWIKC, the window-relative writing routines of
  208.    WNDWC, or even customize your own.
  209.  
  210.  
  211.    USING THE MANUALS
  212.  
  213.    Disk Based Guides - The manuals for WNDWC are on disk so that you can
  214.    conveniently scan for the topic you are seeking.  You can do this with any
  215.    list or search utility with a search function.  You can also make a printed
  216.    copy.  If you have not already printed this manual, refer to the READ.ME
  217.    file for instructions.  At the present time, no bound manuals are being
  218.    offered with registration.
  219.  
  220.    User's Guide - This manual, the one you are reading now, assumes that as a
  221.    programmer you are already familiar with Turbo C 2.0, and that you have a
  222.    working knowledge of your disk operating system (DOS).  It also assumes
  223.    that you are familiar with QWIKC screen utilities in QWIKC20.ARC.  This
  224.  
  225.  
  226.    Chapter 1, Introduction                                             Page 4
  227.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  228.  
  229.  
  230.    manual will provide the basic instructions for creating and managing
  231.    multi-level windows.  You can even copy examples from this file direct to
  232.    the Turbo C editor for testing.
  233.  
  234.    Reference Guide - This manual describes in detail all functions and
  235.    variables used in WNDWC.  It is alphabetically arranged for easy access in
  236.    a format similar to the TC2 manual.  Use this manual when you have become
  237.    familiar with the basic principles in the User's guide.
  238.  
  239.  
  240.    LICENSING
  241.  
  242.    Registration - These routines and the documentation have been released for
  243.    distribution as Shareware.  You have been given the chance to sample the
  244.    full capability of WNDWC without risk!  If you find that WNDWC is a
  245.    valuable tool, then you are expected to register.  You will find a
  246.    reasonable licensing schedule found in LICENSE.ARC to meet private or
  247.    commercial needs.  When registering, be sure to specify the version for
  248.    Turbo C (such as 2.0) you wish to receive.
  249.  
  250.    Source Code - All registered users will receive source code when the signed
  251.    license agreement is returned with the registration.  In order to link the
  252.    WNDWC routines with your program, the WNDWC source code must be compiled
  253.    and put into a library (.LIB) file.  This is not done for you, since you
  254.    may have certain compiler options you wish to use.  See Appendix X for
  255.    information on compiling the source code.
  256.  
  257.  
  258.    CUSTOMER SERVICE
  259.  
  260.    If you have questions, comments, or suggestions, the Eagle can be contacted
  261.    by four means - (1) CompuServe, (2) telephone, (3) The Eagle BBS, or
  262.    (4) mail.
  263.  
  264.    CompuServe - The most dependable way to contact the Eagle is through
  265.    CompuServe.  Jordan Gallagher has written the TC2 version of WNDWC.  He can
  266.    be contacted on the Borland Forum by typing GO BPROGB from the CompuServe
  267.    main menu.  You will enter the forum for Turbo C.  You can contact Jordan
  268.    with his PPN number of 73557,2342.  Messages can also be left through
  269.    EasyPlex.
  270.  
  271.    Telephone - Jordan can also be reached by phone at (214) 539-7855 on
  272.    weekdays and Saturday from 9:00 a.m. to 8:00 p.m CST.
  273.  
  274.    The Eagle BBS - You can also contact us on our 24-hour BBS at
  275.    (214) 539-9878, 1200/2400 N81.
  276.  
  277.    Mail - For registration or problems, please write:
  278.  
  279.        Eagle Performance Software
  280.        TC/TP products
  281.        P.O. Box 292786
  282.        Lewisville, TX  75029-2786
  283.  
  284.    We also provide identical Turbo Pascal products!
  285.  
  286.  
  287.    Chapter 1, Introduction                                             Page 5
  288.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  289.  
  290.  
  291.  
  292.    In your written request for resolving problems, be sure to include:
  293.  
  294.      . A 5 1/4 inch diskette of compilable source code of the problem.
  295.      . The Eagle product and version number.
  296.      . The computer make and model.
  297.      . The type of video card, video monitor and keyboard.
  298.  
  299.  
  300.    ASP
  301.  
  302.    WNDWC is a Shareware program conforming to the standards of the Association
  303.    of Shareware Professionals (ASP).  You can get more information about ASP
  304.    by writing to:
  305.  
  306.      Association of Shareware Professionals
  307.      P.O. Box 5786
  308.      Bellevue, WA  98006.
  309.  
  310. |  This program is produced by a member of the Association of Shareware
  311. |  Professionals (ASP).  ASP wants to make sure that the shareware principle
  312. |  works for you.  If you are unable to resolve a shareware-related problem
  313. |  with an ASP member by contacting the member directly, ASP may be able to
  314. |  help.  The ASP Ombudsman can help you resolve a dispute or problem with an
  315. |  ASP member, but does not provide technical support for member's products.
  316. |  Please write to:
  317. |
  318. |    ASP Ombudsman
  319. |    P.O. Box 5786
  320. |    Bellevue,WA 98006
  321. |
  322. |  or send a CompuServe message via EasyPlex to ASP Ombudsman 7007,3536.
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.    Chapter 1, Introduction                                             Page 6
  349.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  350.  
  351.  
  352.    2.  G E T T I N G   S T A R T E D
  353.  
  354.    This section will acquaint you with the files on the distribution disk and
  355.    show you a couple of demonstrations to quickly see what WNDWC can
  356.    accomplish.
  357.  
  358.  
  359.    DISTRIBUTION FILES
  360.  
  361.    In this version, WNDWC20.ARC contains:
  362.  
  363.      READ    .ME :  Note of printing instructions for manual.
  364.      KEYBC20 .LIB:  Keyboard library for WNDWMGR.C demo.
  365.      GOOF    .C  :  Module to display errors.
  366.      QWIKC20S.LIB:  Library for quick screen writing.
  367.      WC20VAR .C  :  This file is the actual source code which lists
  368.                     all of the variables used in WNDWC.
  369.      WNDWC20S.LIB:  This library has the full power of all of its
  370.                     capabilities.  Note:  WNDWC20S.LIB was compiled
  371.                     with the current settings for MAXWINDOW,
  372.                     MAXVIRTUALWINDOW, MAXPAGEUSED, and windownames, as
  373.                     defined in WNDWC20.H.  In order to make any
  374.                     changes in the data requirements, the complete
  375.                     source code will be required.
  376.      WNDWC20 .DOC:  This document - a user's guide to WNDWC.
  377.      WNDWREF .DOC:  WNDWC Reference Guide document covering each
  378.                     routine and variable in detail.
  379.      WNDWDEMO.C  :  Demo of WNDWC and QWIKC which shows screen design
  380.                     performance.
  381.      WNDWMGR .C  :  Demo of full window management.
  382.      LICENSE .ARC:  ARC file containing license agreement and ordering
  383.                     details.
  384.  
  385.  
  386.    DEMONSTRATION
  387.  
  388.    To get the feeling of the speed and features of WNDWC, let's run the
  389.    demonstration programs that came with the utilities.  Do the following
  390.    steps:
  391.  
  392.      1. From Turbo C, set your memory model size to "Small".
  393.      2. Build and run the project file WNDWDEMO.PRJ to get a feel
  394.         for screen design performance and speed.
  395. |    3. If you are running programs in a multi-tasking
  396. |       environment, instruct the environment that you are NOT
  397. |       writing direct to the screen.  Also set text pages to 2.
  398.      4. Build and run the project file WNDWMGR.PRJ to get a feel
  399.         for true virtual windows and window management.  (Note:
  400.         You may need to exit the Turbo C environment and run
  401.         WNDWMGR.EXE from DOS.)  Press Alt-1 to access the bottom
  402.         window.  With Scroll Lock on, it can be moved, resized
  403.         and scrolled.
  404.  
  405.  
  406.  
  407.  
  408.  
  409.    Chapter 2, Getting Started                                          Page 7
  410.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  411.  
  412.  
  413.    3.  P R O G R A M M I N G   W I N D O W S
  414.  
  415.    This sections will get you familiar with the basics of window programming
  416.    by starting with very basic windows and then taking you step-by-step
  417.    through the variety of options and modes that are available.
  418.  
  419.  
  420.    BASIC PROGRAMMING
  421.  
  422.    Project File - All example programs in this manual assume that QWIKC20S.LIB
  423.    is in the project file, and that your memory model size is set to "Small".
  424.    Your first project file may look like this:
  425.  
  426.        mywndw1
  427.        qwikc20s.lib
  428.  
  429.    Exiting the Examples - There is a getch() command at the end of most of the
  430.    example programs.  This gives you time to look at the output.  After
  431.    running the example, simply press a key to return to Turbo C.
  432.  
  433.    First Program - Let's write a short program to see how simple it is to
  434.    write with WNDWC.  While in the TC editor, enter the following code:
  435.  
  436.      EXAMPLE 1:  Your first window
  437.      ----------------------------------------------------------------------
  438.      #include <stdio.h>
  439.      #include <conio.h>
  440.      #include <alloc.h>
  441.  
  442.      #include "wndwc20.h"
  443.  
  444.      void main()
  445.      {
  446.          initwindow( LIGHTGRAY_BG, 1, 0 );  /* Initialize and clear window */
  447.          makewindow( 5, 20, 15, 40, WHITE+BLUE_BG, CYAN+BLUE_BG,
  448.                      SINGLE_BORDER, AWINDOW );
  449.          wwritec( 7, "Making windows is easy!" );
  450.          getch();
  451.      }
  452.  
  453.    Save the file and make sure that Turbo C is configured for the Small model.
  454.    Create a project file for it, then compile the project and run the program.
  455.    You can then see these results:
  456.  
  457.       . The base window is cleared with black on light gray attributes.
  458.       . The window is placed at absolute row 5, column 20
  459.       . The window size is 15 rows high and 40 columns wide.
  460.       . The window text color is white on a blue background.
  461.       . The window border color is cyan on a blue background.
  462.       . The border is the single line width style.
  463.       . The window name is AWINDOW.
  464.       . The message was centered on window-relative row 7.
  465.  
  466.    Row/Col vs. X/Y - You probably noticed that the row parameter is first and
  467.    the column parameter is second.  Since WNDWC is entirely for text modes, it
  468.  
  469.  
  470.    Chapter 3, Programming Windows                                      Page 8
  471.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  472.  
  473.  
  474.    is more intuitive to specify the row first and the column second just like
  475.    any word processor.  The X/Y scheme is better suited for graphics.
  476.  
  477.    Attributes - Notice that our example uses the macro BLUE_BG.  WNDWC uses
  478.    QWIKC which provides eight convenient background color constants to use
  479.    along with Turbo C's 16 foreground colors in CONIO.H.  The same names are
  480.    used, but the "_BG" suffix is added:
  481.  
  482.       BLACK_BG      RED_BG
  483.       BLUE_BG       MAGENTA_BG
  484.       GREEN_BG      BROWN_BG
  485.       CYAN_BG       LIGHTGRAY_BG
  486.  
  487.    These allow WNDWC to make the most of Turbo C's macros.  By simply adding
  488.    the foreground and background macros together, the compiler saves the
  489.    result as a single word.  And, by simply reading the makewindow statement,
  490.    what you see is what you get (WYSIWYG).
  491.  
  492.    Protected Underlay - That first program was pretty simple, wasn't it?
  493.    Several things happened that you probably didn't notice.  The area under
  494.    the window, called the underlay, was actually saved.  Later on when the
  495.    window is no longer needed, it can be removed by restoring the underlay.
  496.    This makes it just like a sheet of paper on a desk.  Let's add some
  497.    statements to show if the underlay is really protected.  In addition, let's
  498.    add a little more pizzazz to the window by adding a shadow, zoom effect,
  499.    and a title:
  500.  
  501.      EXAMPLE 2:  Protected underlay
  502.      ----------------------------------------------------------------------
  503.      #include <conio.h>
  504.      #include <dos.h>
  505.      #include "wndwc20.h"
  506.  
  507.      void main()
  508.      {
  509.          initwindow( LIGHTGRAY_BG, 1, 0 );
  510.          wwritec( 12, "Base Window" );
  511.          setwindowmodes( ZOOMMODE+SHADOWRIGHT );
  512.          makewindow( 5, 20, 15, 40, WHITE+BLUE_BG, CYAN+BLUE_BG,
  513.                      SINGLE_BORDER, AWINDOW );
  514.          titlewindow( TOP, LEFT, YELLOW+BLUE_BG, " My First Window " );
  515.          wwritec( 7, "Making windows is easy!" );
  516.          delay(2000);
  517.          removewindow();   /* Remove the window and restore underlay. */
  518.          getch();
  519.      }
  520.  
  521.    Did you see that the message "Base Window" was still there?  In fact the
  522.    entire underlay was protected because it was saved in the heap while we
  523.    were writing on the CRT.  In addition:
  524.  
  525.       . The window modes controlled the shadow and zoom effect.
  526.       . The title is placed on the top border, left justified, with yellow
  527.         on blue attributes.
  528.       . The "Base Window" message was centered on window-relative row 12.
  529.  
  530.  
  531.    Chapter 3, Programming Windows                                      Page 9
  532.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  533.  
  534.  
  535.  
  536.    Basic Principles - Was that simple enough for you?  Well, you'll be glad to
  537.    know that you have already tried all the basic principles to making
  538.    windows.  And the rest is just that easy.  But you haven't seen anything
  539.    yet.
  540.  
  541.  
  542.    WINDOW DEFINITIONS
  543.  
  544.    Window - Just what is a window anyway?  It's an area reserved on the screen
  545.    as a frame of reference to write text.  Right on the screen, the power of
  546.    this program allows you to move, rearrange, hide, move, and resize, without
  547.    losing any data.
  548.  
  549.    View - In virtual windows, this window text area is also called the view.
  550.    More about virtual windows is explained later.
  551.  
  552.    Border - The border is the lines surrounding the window or view to clearly
  553.    separate the window contents from other areas of the CRT.  However, a
  554.    window does not require a border.
  555.  
  556.    Title - Conveniently, a window can be titled on the border - either the top
  557.    or the bottom.  The title area extends the full length of the window not
  558.    including the two vertical borders.  The title is written at a border-
  559.    relative location.  If a window does not have a border, then the title area
  560.    is just the top or bottom row of the window text area.
  561.  
  562.    Cursor - Each window has its own cursor location and mode (shape).
  563.  
  564.    Shadow - To give a window that off-the-screen appearance, a shadow can be
  565.    added onto the outer edge of the window or window border.
  566.  
  567.    Generally Speaking - Throughout this document, the word "window" will
  568.    loosely refer to all of the above parts as the full window.  It should be
  569.    understood that all writing to the windows uses coordinates relative to the
  570.    upper left corner of the window text area which is (1,1) exclusive of the
  571.    border.
  572.  
  573.  
  574.    BASIC ROUTINES
  575.  
  576.    Basic Routines - There are five basic functions that are fundamental to
  577.    creating multi-level windows:
  578.  
  579.      initwindow     - Initializes static data and pointers for the
  580.                       program.  Also calls qinit.
  581.      setwindowmodes - Determines what types of windows are made.
  582.      makewindow     - Creates the window.
  583.      titlewindow    - Places titles on the window.
  584.      removewindow   - Removes window from CRT and memory.
  585.  
  586.    initwindow - First, before any window functions are used, initwindow should
  587.    be executed to initialize all global data for the entire program.  It only
  588.    needs to be done once.
  589.  
  590.  
  591.  
  592.    Chapter 3, Programming Windows                                      Page 10
  593.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  594.  
  595.  
  596.      void initwindow( int wattr, int clearscr, char cursorok );
  597.  
  598.    The initial base window has no border and wattr is the window attribute.
  599.    You can optionally clear the window by passing clearscr as 1.  The function
  600.    initializes over 50 variables.  For details, you can examine the source
  601.    code.
  602.  
  603.  
  604.    MAKEWINDOW PARAMETERS
  605.  
  606.    Declaration - The makewindow function actually makes the window on the
  607.    screen.  Let's take a look at its declaration:
  608.  
  609.      void makewindow( char row, char col, char rows, char cols, int wattr,
  610.                       int battr, int brdrsel, int windowname );
  611.  
  612.    The function's parameters control location, size, attributes, border style,
  613.    and window name.  Notice that the size is expressed as rows/cols rather
  614.    than another (row2,col2) coordinate.  This makes it very easy to change the
  615.    location without having to recalculate the size.
  616.  
  617. |  Self-Centering Window - There is a very simple method to self-center a
  618. |  window on a screen - simply set the appropriate Row and/or Col parameter to
  619. |  0.  If Row is 0, the window will be centered to the current height of the
  620. |  screen.  Likewise, if Col is 0, it will be centered horizontally.  So
  621. |  there's no need to calculate sizes!  This also works for RELMODE which will
  622. |  be discussed later.
  623.  
  624.    Attributes - wattr and battr are the attributes for the window text area
  625.    and border, respectively.  The attributes that are recognized are the same
  626.    ones used in QWIKC - even SAMEATTR is supported.
  627.  
  628.    Border Styles - There are 15 different border styles that can be used for
  629.    the border, including two custom borders and even no border at all.  Here
  630.    is the list of border macros from WNDWC20.H:
  631.  
  632.      NO_BORDER           - No border at all.  Just the text area.
  633.      BLANK_BORDER        - Blank character on all sides.
  634.      SINGLE_BORDER       - Single lines on all sides.
  635.      DOUBLE_BORDER       - Double lines on all sides.
  636.      HDOUBLE_BORDER      - Horizontal double lines.  Single vertical lines.
  637.      VDOUBLE_BORDER      - Vertical double lines.  Single horizontal lines.
  638.      SOLID_BORDER        - Solid box character on all sides.
  639.      EVEN_SOLID_BORDER   - Vertical solid box.  Horizontal half box.
  640.      THIN_SOLID_BORDER_1 - Half box on all sides.  Squeezed horizontally.
  641.      THIN_SOLID_BORDER_2 - Half box on all sides.  Squeezed vertically.
  642.      LHATCH_BORDER       - Light hatch character on all sides.
  643.      MHATCH_BORDER       - Medium hatch character on all sides.
  644.      HHATCH_BORDER       - Heavy hatch character on all sides.
  645.      USER_BORDER_1       - User defined border.
  646.      USER_BORDER_2       - User defined border.
  647.  
  648.    All of the borders except the user borders are reserved for use in future
  649.    Eagle products.  USER_BORDER_1 and USER_BORDER_2 may be customized to your
  650.    needs.  Each border has 15 different parts for the line drawing set
  651.  
  652.  
  653.    Chapter 3, Programming Windows                                      Page 11
  654.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  655.  
  656.  
  657.    including tees and interior lines.
  658.  
  659.    Tip: Hatch Borders - Since MDA and VGA both use a 9x16 character cell size,
  660.    the hatch characters (ASCII 176, 177, 178) are only 8x16 in a 9x16 cell.
  661.    This unfortunately produces a horizontal gap between the characters not
  662.    seen on the CGA.  Be aware of the effect.
  663.  
  664.    Window Name - The name of each window should be different in order to
  665.    uniquely identify the window for window management.  But since our simple
  666.    test program only displayed the window momentarily, the window name is not
  667.    significant and did not need to be unique.  So, the generic name AWINDOW
  668.    was used.  The name WINDOW0 is used to identify the initial base window
  669.    which is the full CRT screen.
  670.  
  671.  
  672.    WINDOW MODES
  673.  
  674.    Defaults - Without needing to specify anything, the window is created with
  675.    several defaults.  Let's see what they are:
  676.  
  677.      . Fixed size and placed absolute to the CRT.
  678.      . Shown on the CRT.
  679.      . The underlay is saved.
  680.      . No shadow or zoom effect.
  681.      . No virtual screen.
  682.      . Cursor is turned on with the default cursor mode.
  683.      . Window is cleared.
  684.      . Moving and accessing is permitted.
  685.  
  686.    Well, if these are all defaults, then that means they can be changed.  And
  687.    they can.  We've already found out how to add shadow and zoom.  Let's try
  688.    changing some others and see what happens.  Type in and compile the
  689.    following program:
  690.  
  691.      EXAMPLE 3:  Different modes and a hidden window
  692.      ----------------------------------------------------------------------
  693.      #include <conio.h>
  694.      #include <dos.h>
  695.      #include "wndwc20.h"
  696.  
  697.      void main()
  698.      {
  699.          initwindow( LIGHTGRAY_BG, 1, 0 );
  700.          setwindowmodes( HIDDENMODE | ZOOMMODE | CURSOROFFMODE );
  701.          makewindow( 5, 20, 15, 40, WHITE+BLUE_BG, CYAN+BLUE_BG,
  702.                      SINGLE_BORDER, WINDOW1 );
  703.          wwritec( 12, "Where is it?" );
  704.          writetohidden( WINDOW1 );    /* Write to the hidden window. */
  705.          titlewindow( BOTTOM, RIGHT, YELLOW+BLUE_BG, " My Second Window " );
  706.          wwritec( 3, "Here it is ..." );
  707.          wbrdrh( 7 );                 /* Add an extra horizontal border. */
  708.          wwritec( 10, "It was hidden!" );
  709.          delay( 2000 );
  710.          showwindow( WINDOW1 );       /* Put it back on the screen. */
  711.          delay( 2500 );
  712.  
  713.  
  714.    Chapter 3, Programming Windows                                      Page 12
  715.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  716.  
  717.  
  718.          removewindow();
  719.          getch();
  720.      }
  721.  
  722.    When you run it, the window is immediately created.  But instead we see the
  723.    message "Where is it?".  And to answer that question, the window was
  724.    created in RAM instead of on the CRT.  In addition, the code also wrote
  725.    messages direct to the hidden window.  The window remains hidden until it
  726.    is called which we did with showwindow.  Afterward, we removed it from
  727.    memory with removewindow.  I'll bet you didn't know that you have already
  728.    done some writing to a virtual screen.  That's right - the hidden window
  729.    was a virtual screen!  Pretty easy, huh?  And it was done by simply setting
  730.    a mode.
  731.  
  732.    setwindowmodes - This function can be used any time prior to makewindow.
  733.    It only needs to be done once since the value is retained in windowmodes
  734.    until changed again.
  735.  
  736.    List of Modes - Did you notice the zoom effect this time and that the
  737.    cursor was turned off?  Let's take a look at all the available modes:
  738.  
  739.      Mode Constant  Description
  740.      -------------  -----------------------------------------------
  741.      SHADOWLEFT     Shadow on the left side
  742.      SHADOWRIGHT    Shadow on the right side
  743.      ZOOMMODE       Zoom effect on make, show and accesswindow
  744.      CURSOROFFMODE  Leaves cursor off for window
  745.      RELMODE        Window-relative frame of reference, no underlay
  746.      PERMMODE       Can't be moved or removed, no underlay
  747.      SEETHRUMODE    Doesn't clear screen inside window
  748.      HIDDENMODE     Create window as hidden
  749.      VIRTUALMODE    Create virtual window and screen
  750.      NOHIDEMODE     Ignores request to hide window
  751.      NOACCESSMODE   Ignores request to access window
  752.      NOMOVEMODE     Ignores request to move/resize window
  753.  
  754.    We've already seen what the first four can do.  Let's check to see what the
  755.    others can do.
  756.  
  757.    SHADOWLEFT/SHADOWRIGHT - When placed on the CRT, the window gets a shadow
  758.    on either the left or right side as well as the bottom.  For good human
  759.    factors, it is recommended that the shadow only be used for the top window
  760.    for clarity.  Shadows are fully supported at any level for serial-access
  761.    windows.  (However, for random-access, the shadows are permitted, but if a
  762.    window is pulled out from under it, the corners will not be updated at that
  763.    moment.)  Tip: Place windows with shadows correctly to prevent wrap-around.
  764.  
  765.    ZOOMMODE - When a window is created, shown, or accessed on the CRT with
  766.    this mode, it produces a zoom effect.  It is conveniently suppressed for
  767.    hidden windows.
  768.  
  769.    RELMODE - This is the simplest of all modes.  It enables you to set up a
  770.    window within a window.  It simply overwrites the window, but produces a
  771.    handy window-relative frame of reference to draw borders, write text or
  772.    whatever.  It's a worry-free mode.  To get out of RELMODE, you can simply
  773.  
  774.  
  775.    Chapter 3, Programming Windows                                      Page 13
  776.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  777.  
  778.  
  779.    switch to another window, or you can return to the parent window with
  780.    removewindow.  RELMODE is only temporary and no stats are saved.  Let's
  781.    modify the last example and try this out:
  782.  
  783.      EXAMPLE 4:  RELMODE window
  784.      ----------------------------------------------------------------------
  785.      #include <conio.h>
  786.      #include <dos.h>
  787.      #include "wndwc20.h"
  788.  
  789.      void main()
  790.      {
  791.          initwindow( LIGHTGRAY_BG, 1, 0 );
  792.          setwindowmodes( HIDDENMODE | ZOOMMODE | CURSOROFFMODE );
  793.          makewindow( 5, 20, 15, 40, WHITE+BLUE_BG, CYAN+BLUE_BG,
  794.                      SINGLE_BORDER, WINDOW1 );
  795.          wwritec( 12, "Where is it?" );
  796.          writetohidden( WINDOW1 );     /* Write to the hidden window. */
  797.          titlewindow( BOTTOM, RIGHT, YELLOW+BLUE_BG, " My Second Window " );
  798.          setwindowmodes( RELMODE );
  799.          makewindow( 3, 4, 3, 32, SAMEATTR, SAMEATTR, HDOUBLE_BORDER,
  800.                      AWINDOW );
  801.          titlewindow( TOP, CENTER, SAMEATTR, " My Answer: " );
  802.          wwritec( 1, "Here it is ..." );
  803.          delay( 2000 );
  804.          showwindow( WINDOW1 );         /* Put it back on the screen. */
  805.          wwritec( 10, "It was hidden!" );
  806.          getch();
  807.      }
  808.  
  809.    Notice that the (row,col) location was relative to the parent window,
  810.    WINDOW1.  Even the title as well as the text was placed in RELMODE.  Once
  811.    the window was shown, the window coordinates and modes were restored to the
  812.    parent window.  The message appeared correctly on row 10 of the parent
  813.    window.  Notice also that we didn't bother to use removewindow since we
  814.    were finished and wanted to take a closer look at what we created.
  815.  
  816.    PERMMODE - When creating your initial screen for a program, the underlay
  817.    probably does not need to be saved.  This mode enables you to create
  818.    windows without saving the underlay so the screen is simply overwritten  -
  819.    perfect for initial screens by increasing speed and saving memory.  All the
  820.    window stats are still saved for future use.  Keep in mind two rules for
  821.    this mode.  First, all PERMMODE windows must be the first ones created.
  822.    And second, use discretion when accessing the window to make sure it is not
  823.    covered by another window before writing to it.  Let's try an example:
  824.  
  825.      EXAMPLE 5:  PERMMODE window
  826.      ----------------------------------------------------------------------
  827.      #include <conio.h>
  828.      #include <dos.h>
  829.      #include "wndwc20.h"
  830.  
  831.      void main()
  832.      {
  833.          initwindow( LIGHTGRAY_BG, 0, 0 );   /* No need to clear screen */
  834.  
  835.  
  836.    Chapter 3, Programming Windows                                      Page 14
  837.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  838.  
  839.  
  840.          setwindowmodes( PERMMODE );
  841.          makewindow( 1, 1, 12, 80, WHITE+BLUE_BG, CYAN+BLUE_BG, SINGLE_BORDER,
  842.                      WINDOW1 );
  843.          titlewindow( TOP, LEFT, YELLOW+BLUE_BG, " Input Window " );
  844.          makewindow( 13, 1, 13, 80, WHITE+GREEN_BG, GREEN_BG, HDOUBLE_BORDER,
  845.                      WINDOW2 );
  846.          titlewindow( TOP, LEFT, YELLOW+GREEN_BG, " Output Window " );
  847.          wwrite( 1, 1, "Output data." );
  848.          accesswindow( WINDOW1 );
  849.          wwrite( 1, 1, "Input data." );
  850.          getch();
  851.      }
  852.  
  853.    Since we were designing the initial screen, the clearscr parameter in
  854.    initwindow was set to 0.  Did you notice that writing back to WINDOW1 was
  855.    no problem?   You've just had your first shot at window management!
  856.    accesswindow will let you write to any window by name.  But if removewindow
  857.    is used on PERMMODE windows, the window record is simply dropped from the
  858.    stack and the screen appears unaltered.
  859.  
  860.    SEETHRUMODE - If there is a portion of the current screen that needs to be
  861.    captured to become a part of the window itself, this mode creates the
  862.    border but simply skips clearing contents the window.  This is done only
  863.    when the window is first created.
  864.  
  865.      EXAMPLE 6:  SEETHRUMODE window
  866.      ----------------------------------------------------------------------
  867.      #include <conio.h>
  868.      #include <dos.h>
  869.      #include "wndwc20.h"
  870.  
  871.      void main()
  872.      {
  873.          initwindow( LIGHTGRAY_BG, 1, 0 );
  874.          wwritec( 12, "My message" );
  875.          setwindowmodes( SEETHRUMODE );
  876.          delay( 1000 );
  877.          makewindow( 10, 26, 5, 30, WHITE+BLUE_BG, CYAN+BLUE_BG,
  878.                      SINGLE_BORDER, AWINDOW );
  879.          titlewindow( TOP, LEFT, YELLOW+BLUE_BG, " Captured Text " );
  880.          delay( 2500 );
  881.          removewindow();
  882.          getch();
  883.      }
  884.  
  885.    When running this program, it appears that a border was just placed over
  886.    the message "My message".  But in fact, it's really a part of the new top
  887.    window.  So, if the window is moved, the contents move as well.
  888.  
  889.    HIDDENMODE - In example 3, we plunged right into making hidden windows and
  890.    it was easy, too.  As it was explained, the hidden window is actually a
  891.    virtual window in the heap to which you can write at any time.  Since
  892.    virtual screen writing is so very quick, you can even design full screens
  893.    in an instant and then display them on the CRT.  Once a window is shown, it
  894.    can always be hidden again with hidewindow.  This is explained further in
  895.  
  896.  
  897.    Chapter 3, Programming Windows                                      Page 15
  898.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  899.  
  900.  
  901.    Section 6 under Window Management.
  902.  
  903.    VIRTUALMODE - This mode is very simple but powerful and enables you to
  904.    create a virtual window.  A virtual screen is kept in RAM, but we can view
  905.    any portion of it on the CRT.  As you would hope, it's still quite simple:
  906.  
  907.      EXAMPLE 7:  VIRTUALMODE window
  908.      ----------------------------------------------------------------------
  909.      #include <conio.h>
  910.      #include <dos.h>
  911.      #include "wndwc20.h"
  912.  
  913.      void main()
  914.      {
  915.          initwindow( LIGHTGRAY_BG, 1, 0 );
  916.          setwindowmodes( VIRTUALMODE );
  917.          makewindow( 5, 20, 15, 40, WHITE+BLUE_BG, CYAN+BLUE_BG,
  918.                      SINGLE_BORDER, WINDOW1 );
  919.          writetovirtual( WINDOW1 );
  920.          titlewindow( TOP, LEFT, YELLOW+BLUE_BG, " Virtual Window " );
  921.          wwrite( 1, 1, "Upper left corner" );
  922.          wwritec( 7, "This message is centered on the screen" );
  923.          vupdatewindow();        /* Update the complete window on the CRT. */
  924.          writetocrt();           /* Return to writing on the CRT. */
  925.          getch();
  926.      }
  927.  
  928.    vupdatewindow is the workhorse for virtual windows.  It copied a portion of
  929.    the virtual screen, the virtual titles, and the cursor location back on the
  930.    CRT.  You probably noticed that the long message seemed to be cut off.  But
  931.    actually we are only looking at a portion of an 80x25 virtual screen.  So
  932.    the message was indeed centered.  You can write direct to the virtual
  933.    screen and view any portion you want.  We have just sampled some of the
  934.    most powerful features of WNDWC with very little effort.
  935.  
  936.    Restrictive Modes - NOHIDEMODE, NOACCESSMODE, and NOMOVEMODE are modes that
  937.    restrict window management.  These modes are covered in the Window
  938.    Management section.
  939.  
  940.    Back to Defaults - What about getting back to the default modes after they
  941.    have been changed?  Just use setwindowmodes(0).
  942.  
  943.    Combinations - Just about any combination of modes can put together.  Just
  944.    sum them together in the setwindowmodes function.  However, there are some
  945.    combinations that will not be valid.  In fact, the function corrects your
  946.    mistakes.  Here's a list of the modes showing invalid combinations:
  947.  
  948.      Set Mode       Invalid Combination With     Correction
  949.      -------------  ---------------------------  -------------------
  950.      SHADOWLEFT     SHADOWRIGHT                  SHADOWRIGHT
  951.      SHADOWRIGHT    SHADOWLEFT                   SHADOWRIGHT
  952.      ZOOMMODE       SEETHRUMODE                  Ignores ZOOMMODE
  953.      RELMODE        HIDDEN, VIRTUAL or PERMMODE  RELMODE
  954.      PERMMODE       HIDDENMODE                   PERMMODE
  955.                     RELMODE                      RELMODE
  956.  
  957.  
  958.    Chapter 3, Programming Windows                                      Page 16
  959.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  960.  
  961.  
  962.      SEETHRUMODE    ZOOMMODE                     Ignores ZOOMMODE
  963.      HIDDENMODE     RELMODE or PERMMODE          RELMODE or PERMMODE
  964.      VIRTUALMODE    RELMODE                      RELMODE
  965.  
  966.  
  967.    CURSOR MODES
  968.  
  969.    Every Window - WNDWC fully supports the cursor mode control of QWIKC.  In
  970.    fact, every window has its own cursor mode.  The setting is controlled by
  971.    setcursordefault.  Here's how it works:
  972.  
  973.      EXAMPLE 8:  Cursor modes in each window
  974.      ----------------------------------------------------------------------
  975.      #include <conio.h>
  976.      #include <dos.h>
  977.      #include "wndwc20.h"
  978.  
  979.      void main()
  980.      {
  981.          initwindow( LIGHTGRAY_BG, 1, 0 );
  982.          makewindow( 5, 20, 15, 40, WHITE+BLUE_BG, CYAN+BLUE_BG,
  983.                      SINGLE_BORDER, WINDOW1 );
  984.          setcursordefault( cursor_block );
  985.          makewindow( 9, 30, 15, 40, WHITE+BROWN_BG, BROWN_BG,
  986.                      EVEN_SOLID_BORDER, WINDOW2 );
  987.          wwrite( 1, 1, "Upper left corner" );
  988.          gotoeos();
  989.          delay( 2000 );
  990.          removewindow();
  991.          delay( 2000 );
  992.          removewindow();
  993.      }
  994.  
  995.    When you ran this code, you noticed that top window had a block cursor.
  996.    When the window was removed, the cursor mode was restored to new top window
  997.    as an underline.  Just like setwindowmodes, the value is saved in
  998.    cursordefault until changed.
  999.  
  1000.    Initialization - When WNDWC is used, some initialization code tests the
  1001.    start up cursor mode.  On MDA cards, it corrects the improper CGA default.
  1002.    In addition, if the cursor is hidden, WNDWC forces the cursor to an
  1003.    underline, but the original cursor is still in cursor_initial.
  1004.  
  1005.    Initial Window - initwindow sets cursor_default to the current cursor mode
  1006.    which is used for all subsequent windows and WINDOW0.  If you even want
  1007.    WINDOW0 to have a different cursor mode and default, simply use setcursor
  1008.    before calling initwindow, and pass cursorok as 1 to initwindow.
  1009.  
  1010.    Mutiple PERMMODE Windows - If you have several PERMMODE windows, to get the
  1011.    cursor to appear correctly in one of the windows, you must use accesswindow
  1012.    when there are only PERMMODE windows left on the screen.  To update any
  1013.    virtual PERMMODE window, you must also use accesswindow rather than using
  1014.    writetovirtual before vupdatewindow.
  1015.  
  1016.    CURSOROFFMODE - So, what's the difference between using
  1017.  
  1018.  
  1019.    Chapter 3, Programming Windows                                      Page 17
  1020.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1021.  
  1022.  
  1023.    setwindowmodes(CURSOROFFMODE) or setcursordefault( cursor_off )?  For
  1024.    technical reasons, in virtual windows, the cursor could be turned on and
  1025.    off.  If the setting of cursor_off is used, then the cursor could be turned
  1026.    on having an overbar cursor (0x0000).  It's easier to use CURSOROFFMODE.
  1027.  
  1028.  
  1029.  
  1030.  
  1031.  
  1032.  
  1033.  
  1034.  
  1035.  
  1036.  
  1037.  
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061.  
  1062.  
  1063.  
  1064.  
  1065.  
  1066.  
  1067.  
  1068.  
  1069.  
  1070.  
  1071.  
  1072.  
  1073.  
  1074.  
  1075.  
  1076.  
  1077.  
  1078.  
  1079.  
  1080.    Chapter 3, Programming Windows                                      Page 18
  1081.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1082.  
  1083.  
  1084.    4.  W R I T I N G   T O   W I N D O W S
  1085.  
  1086.    WNDWC has several window-relative routines designed to write in the
  1087.    windows, including direct writing, cursor and EOS positioning, clearing,
  1088.    scrolling, and line drawing.  They work in all types of windows, including
  1089.    hidden and virtual.  To do this, the routines access the top window record
  1090.    (tws or topwndwstat) that keeps information about the current window.  For
  1091.    a breakdown on the window structure, see Data Structure in WNDWREF.DOC.
  1092.    Each of these groups of routines are discussed below.
  1093.  
  1094.  
  1095.    DIRECT WRITING
  1096.  
  1097.    Window Relative - Rather than using qwrite to write to windows, three
  1098.    routines are provided to use window-relative coordinates.  You have already
  1099.    used two of them.  The attribute used is the window attribute tws.wndwattr.
  1100.  
  1101.      void wwrite     ( char row, char col, char *astr );
  1102.      void wwritec    ( char row, char *astr );
  1103.      void wwrite_sub ( char row, char col, int arraylength, char *astr );
  1104.  
  1105.    wwritec centers the string within the window while wwrite_sub is for arrays
  1106.    or substrings.  These routines simply call the QWIKC routines using tws for
  1107.    a window-relative write.
  1108.  
  1109.    QWIKC Support - You will be pleased to know that QWIKC is fully integrated
  1110.    and supported in WNDWC like your favorite use of SAMEATTR and the EOS
  1111.    marker.  Wherever an attribute is needed, SAMEATTR can be used.  And all
  1112.    the window-relative writing routines support the EOS.  For example, to
  1113.    chain after a wwrite statement, just do the following:
  1114.  
  1115.      wwrite( 1, 2, "My message" );
  1116.      qwriteeos( SAMEATTR, " is here" );
  1117.  
  1118.    This would write the message "My message is here" on window-relative row 1,
  1119.    column 2, also indicated as (1,2), with the current window attribute.
  1120.  
  1121.    Changing Attributes - Suppose you do not want to use the current window
  1122.    attribute.  How can it be altered?  The qwriteeos example above is one way.
  1123.    But since the original window attribute is saved in tws.origattr, it can be
  1124.    changed temporarily by doing the following:
  1125.  
  1126.      tws.wndwattr = newattr;          /* Assign new attribute */
  1127.      wwrite( 1, 1, "New Attribute" );
  1128.      tws.wndwattr = tws.origattr;     /* Restore window attribute */
  1129.  
  1130.  
  1131.    CURSOR AND EOS POSITIONING
  1132.  
  1133.    WNDWC has eight routines to locate and move either the cursor or the EOS
  1134.    marker relative to the current window.
  1135.  
  1136.  
  1137.    Cursor Location - Just like wherer/wherec, the following functions return
  1138.    the current cursor location:
  1139.  
  1140.  
  1141.    Chapter 4, Writing to Windows                                       Page 19
  1142.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1143.  
  1144.  
  1145.  
  1146.      wwherer - Window-relative row.
  1147.      wwherec - Window-relative column.
  1148.  
  1149.    Cursor Movement - Similar to gotorc and gotoeos, the following functions
  1150.    move the cursor:
  1151.  
  1152.      wgotorc  - Move to window-relative row and column.
  1153.      wgotoeos - Move cursor to match EOS marker location.
  1154.  
  1155.    So, what's the difference between gotoeos and wgotoeos?  The latter does
  1156.    two more operations - (1) the cursor location is saved in tws, and (2) the
  1157.    cursor mode is tested in virtual windows to be turned on or off.  To be
  1158.    consistent in windows, it is easier to use wgotoeos.
  1159.  
  1160.    EOS Location - Similar to eosr and eosc, the following functions return the
  1161.    current EOS location:
  1162.  
  1163.      weosr - Window-relative row.
  1164.      weosc - Window-relative column.
  1165.  
  1166.    EOS Movement - Similar to eostorc and qeosln, the following functions move
  1167.    the EOS marker:
  1168.  
  1169.      weostorc - Move EOS to window-relative row and column.
  1170.      weosln   - Move EOS to column 1 of the next row with a possible
  1171.                 scroll if past the last window row.
  1172.  
  1173.  
  1174.    CLEARING
  1175.  
  1176.    WNDWC provides seven window-relative routines for clearing portions of the
  1177.    window including lines, titles, fields, and even the full window with the
  1178.    window attribute tws.wndwattr.  SAMEATTR becomes very handy when complex
  1179.    attribute fields have already been designed into the window.
  1180.  
  1181.      wclrscr      - Clears entire window.
  1182.      wclrtitle    - Clears entire title given TOP or BOTTOM.
  1183.      wclrline     - Clears an entire row.
  1184.      wclreol      - Clears a row to end-of-line given a (row,col).
  1185.      wclreos      - Clears a row from EOS to EOL.
  1186.      wclrfield    - Clears a field given a (row,col).
  1187.      wclrfieldeos - Clears a field at EOS.
  1188.  
  1189.    Each of these functions place the EOS marker at the beginning of the
  1190.    cleared area for convenient chaining.  (wclrtitle does not alter EOS.)  The
  1191.    latter four functions also provide an optional attribute change.  Here are
  1192.    some examples with a variety of ways to enter data using many of the above
  1193.    window-relative routines:
  1194.  
  1195.      EXAMPLE 9:  Window-relative writing routines
  1196.      ----------------------------------------------------------------------
  1197.      #include <stdio.h>
  1198.      #include <conio.h>
  1199.      #include "wndwc20.h"
  1200.  
  1201.  
  1202.    Chapter 4, Writing to Windows                                       Page 20
  1203.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1204.  
  1205.  
  1206.  
  1207.      char *s1,*s2,*s3,s4[80];
  1208.      int r1,r2;
  1209.      char ch;
  1210.  
  1211.      void main()
  1212.      {
  1213.          initwindow( LIGHTGRAY_BG, 1, 0 );
  1214.          makewindow( 5, 20, 15, 40, WHITE+BLUE_BG, CYAN+BLUE_BG,
  1215.                      SINGLE_BORDER, WINDOW1 );
  1216.          s1 = " a:\\long\\long\\filename";
  1217.          s2 = " a:\\shorter\\filename";
  1218.          s3 = " error message";
  1219.          r1 = 1;
  1220.          r2 = 14330;
  1221.          wwrite    ( 2, 2, "File name: " );
  1222.          wclreos   ( LIGHTGRAY_BG );            /* Clear first field */
  1223.          qwriteeos ( SAMEATTR, s1 );            /* Put in file name */
  1224.          wwrite    ( 3, 2, "Status" );
  1225.          wclrfield ( 3, 13, 20, LIGHTGRAY_BG ); /* Clear second field */
  1226.          qwriteeos ( SAMEATTR, s3 );            /* Put in status message */
  1227.          wwrite    ( 4, 2, "Quantity:  " );
  1228.          wclrfieldeos( 20, LIGHTGRAY_BG );      /* Clear third field */
  1229.          sprintf( s4, "%19d", r1 );             /* Put in formatted data */
  1230.          qwriteeos( SAMEATTR, s4 );
  1231.          eostorcrel( 0, -1 );                   /* Shift EOS back one space */
  1232.          wgotoeos();
  1233.          titlewindow( BOTTOM, CENTER, YELLOW+BLUE_BG+BLINK,
  1234.                       " Press any key " );
  1235.          while(getch() == 0);
  1236.          wclrtitle( BOTTOM );
  1237.          tws.wndwattr = SAMEATTR;      /* Keeps field attributes intact */
  1238.          wwrite  ( 2, 13, s2 );
  1239.          wclreos ( SAMEATTR );         /* Clears remainder of long filename */
  1240.          wclreol ( 3, 13, SAMEATTR );  /* Clears beyond field, But A OK! */
  1241.          sprintf ( s4, "%19d", r2 );
  1242.          wwrite  ( 4, 13, s4 );        /* Overwrites new data */
  1243.          tws.wndwattr = tws.origattr;  /* Restore window attribute */
  1244.          getch();
  1245.      }
  1246.  
  1247.    When running this example, the window will display the formatted data in
  1248.    their fields.  Press a key as requested, and the fields will be updated
  1249.    with new data.  Notice that the fields are only overwritten and not cleared
  1250.    first.  This produces the best human factors by appearing flawless.
  1251.  
  1252.  
  1253.    SCROLLING
  1254.  
  1255.    Some operations may require scrolling all or just portions of a window.
  1256.    WNDWC has four routines to do this, and like all other WNDWC routines, they
  1257.    operate in all windows and video pages at the highest speed without flicker
  1258.    or snow.
  1259.  
  1260.    Full Window - To scroll the entire window, two routines scroll the window
  1261.  
  1262.  
  1263.    Chapter 4, Writing to Windows                                       Page 21
  1264.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1265.  
  1266.  
  1267.    up or down.  You may also want to consider the conditional scroll of
  1268.    weosln:
  1269.  
  1270.      wscrollup   - Scrolls window up.
  1271.      wscrolldown - Scrolls window down.
  1272.  
  1273.    Partial Window - Just like Turbo C's insline and delline, these two
  1274.    routines insert and delete lines by specifying the row.
  1275.  
  1276.      wdelline - Deletes the specified row scrolling the remainder up.
  1277.      winsline - Inserts the specified row scrolling the remainder down.
  1278.  
  1279.  
  1280.    LINE DRAWING
  1281.  
  1282.    The border alone is not sufficient for the design of many windows that need
  1283.    to be partitioned in a logical manner.  WNDWC has six functions to
  1284.    completely partition any window - three are for extending the border and
  1285.    three are for a separate line drawing set for inside the window.
  1286.  
  1287.    Border Drawing - The following functions can easily add an extra partition
  1288.    to the window by using the current border style (tws.wsbrdr) and the border
  1289.    attribute (tws.brdrattr):
  1290.  
  1291.      wbrdrh    - draws a horizontal partition at the given row complete with
  1292.                  tees.
  1293.      wbrdrv    - draws a vertical partition at the given columns complete with
  1294.                  tees.
  1295.      wbrdrpart - places a single border part at the given row and column
  1296.                  usually used for a cross or tee.
  1297.  
  1298.    Line Drawing - When a window is created, the line drawing set (tws.wsline)
  1299.    is the same as the border style (tws.wsbrdr) but can freely be changed.
  1300.    The following functions can easily add an extra line within the window by
  1301.    using the line drawing set and the current window attribute (tws.wndwattr):
  1302.  
  1303.      wlineh    - draws just a horizontal line at the given (row,col) repeated
  1304.                  for a number of columns.
  1305.      wlinev    - draws just a vertical line at the given (row,col) repeated
  1306.                  for a number of columns.
  1307.      wlinepart - places a single line part at the given row and column usually
  1308.                  used for a cross or tee.
  1309.  
  1310.    Acronyms - To make it easy to remember each individual part of a border or
  1311.    line set, each part has its own acronym.  For example, BORDER_TL means the
  1312.    Top Left border part.  Here are the parts in their relative positions and
  1313.    their definitions:
  1314.  
  1315.      Relative Position       The first letter of the border acronym mean:
  1316.      ------------------         T = top         B = bottom
  1317.      TL  TH  TT  TH  TR         V = vertical    H = horizontal
  1318.      LV      VL      RV         L = left        R = right
  1319.      LT  HL  CL  HL  RT         C = cross
  1320.      LV      VL      RV      The second letter is the same except for:
  1321.      BL  BH  BT  BH  BR         T = tee         L = line
  1322.  
  1323.  
  1324.    Chapter 4, Writing to Windows                                       Page 22
  1325.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1326.  
  1327.  
  1328.  
  1329.  
  1330.    Example - Let's see if we can try some screen design with these routines in
  1331.    this example:
  1332.  
  1333.      EXAMPLE 10:  Screen design
  1334.      ----------------------------------------------------------------------
  1335.      #include <conio.h>
  1336.      #include <dos.h>
  1337.      #include "wndwc20.h"
  1338.  
  1339.      void main()
  1340.      {
  1341.          initwindow( LIGHTGRAY_BG, 1, 0 );
  1342.          makewindow( 5, 19, 17, 41, GREEN_BG, WHITE+GREEN_BG, VDOUBLE_BORDER,
  1343.                      WINDOW1 );
  1344.          tws.wsline = SINGLE_BORDER;    /* Don't want VDOUBLE_BORDER */
  1345.          wlineh ( 4, 1, tws.wcols );    /* Use wcols for full window width */
  1346.          wlineh ( 12, 1, tws.wcols );
  1347.          wbrdrh ( 8 );
  1348.          wbrdrv ( 20 );
  1349.          wbrdrpart( 8, 20, BRDR_CL );      /* For the Cross Line */
  1350.          getch();
  1351.      }
  1352.  
  1353.    When you see this executed, it is apparent that the borders are connected
  1354.    with tees.  Notice that the line set uses the window attribute.  I'll bet
  1355.    you didn't know screen design could be this easy!  Why use compressed
  1356.    screens?
  1357.  
  1358.  
  1359.    CUSTOM ROUTINES
  1360.  
  1361.    You can make your own custom routines to be window-relative by using the
  1362.    current window record.  This topic will get you familiar with the window
  1363.    coordinates and guide you through an example.
  1364.  
  1365.    Coordinates - The top (or active) window record has two sets of coordinates
  1366.    - one set includes the border and the other excludes it.  Here are the
  1367.    field identifiers for the ones including the border:
  1368.  
  1369.      wsrow  - Row of the top border.
  1370.      wscol  - Column of the left border.
  1371.      wsrows - Number of rows from border to border.
  1372.      wscols - Number of columns from border to border.
  1373.      wsrow2 - Row of the bottom border.
  1374.      wscol2 - Column of the right border.
  1375.  
  1376.    The "ws" acronym means wndwstat which was used to create the window.  But
  1377.    usually you would want the coordinate for the text window exclusive of the
  1378.    border ("w" acronym).  Here are those field identifiers:
  1379.  
  1380.      wrow  - Top row of the window.
  1381.      wcol  - Left column of the window.
  1382.      wrows - Number of rows in the window.
  1383.  
  1384.  
  1385.    Chapter 4, Writing to Windows                                       Page 23
  1386.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1387.  
  1388.  
  1389.      wcols - Number of columns in the window.
  1390.      wrow2 - Bottom row of the window.
  1391.      wcol2 - Right column of the window.
  1392.  
  1393.    For example, to access the top row of the window, use tws.wrow.  This uses
  1394.    the same amount of code as a simple variable.
  1395.  
  1396.    Example - You may have noticed that there is no wfill function included in
  1397.    WNDWC.  That's because it's so simple to customize your own.  Let's try to
  1398.    write one:
  1399.  
  1400.      void wfill( char row, char col, char rows, char cols, char ch )
  1401.      {
  1402.          qfill( tws.wrow+row-1, tws.wcol+col-1, rows, cols, tws.wndwattr,
  1403.                 ch );
  1404.      }
  1405.  
  1406.    You can do the same to all your routines and they can work in any displayed
  1407.    or hidden window, or even virtual screens.
  1408.  
  1409.  
  1410.  
  1411.  
  1412.  
  1413.  
  1414.  
  1415.  
  1416.  
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.  
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.  
  1434.  
  1435.  
  1436.  
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.    Chapter 4, Writing to Windows                                       Page 24
  1447.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1448.  
  1449.  
  1450.    5.  V I R T U A L  W I N D O W S
  1451.  
  1452.    Now that you have a good idea of what windows can do, virtual windows will
  1453.    add a greater magnitude of power and flexibility to your windows with no
  1454.    more effort than what has already been covered.  This section shows the
  1455.    practical applications and how to program them.
  1456.  
  1457.  
  1458.    APPLICATION
  1459.  
  1460.    This topic will help you decide when virtual windows can meet the needs of
  1461.    your programming application.
  1462.  
  1463.  
  1464.    More Power - The default mode for making windows is a fixed-size window
  1465.    with all of the text displayed.  But what if you want variable sized
  1466.    windows or want to write to windows that are not displayed or even covered?
  1467.    Virtual windows to the rescue!  They handle this automatically.
  1468.  
  1469.    Definition - What is a virtual window anyway?  There are two parts to a
  1470.    virtual window - the screen and the view.  The screen part is written in
  1471.    RAM while the view is seen on the CRT.  So, we can write to the screen at
  1472.    any time and show only a portion to the CRT as required!
  1473.  
  1474.    Advantages - Since QWIKC has already developed low-level tools for virtual
  1475.    screens, WNDWC uses them to create quick virtual windows.  Here are the
  1476.    advantages:
  1477.  
  1478.      . Variable row-by-column screen size up to 64k.
  1479.      . Extremely high speed in RAM.
  1480.      . Number of screens only limited by memory.
  1481.      . Can update windows even if they are overlapped, covered, or hidden.
  1482.      . The view can be resized without losing text.
  1483.      . The screen allows wraparound.
  1484.      . Can access any screen at any time.
  1485.  
  1486.    If your application has operations in one window that affects others, then
  1487.    virtual windows are essential.  An example of this is the Turbo Debugger
  1488.    environment where operations in the CPU window affect items in the source
  1489.    code and watch windows.
  1490.  
  1491.  
  1492.    PROGRAMMING
  1493.  
  1494.    Remember, we already did some virtual window programming back in Example 7
  1495.    and there wasn't anything to it.  Now, in this section, you will learn
  1496.    additionally how to make, write, update, view, and resize a virtual window.
  1497.  
  1498.    Compiling - To add the virtual window code when compiling, the macro
  1499.    ADDVIRTUAL must be defined.  The distributed library, QWIKC20S.LIB, has the
  1500.    virtual window code included.  If you have the source code, the macro is
  1501.    found in WNDWC20.H.  To eliminate the code when virtual windows are not
  1502.    needed, simply comment out the statement "#define ADDVIRTUAL".
  1503.  
  1504.    Creating - All we have to do to make a virtual window is use VIRTUALMODE
  1505.  
  1506.  
  1507.    Chapter 5, Virtual Windows                                          Page 25
  1508.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1509.  
  1510.  
  1511.    in the setwindowmodes function.  The default size for screen is the current
  1512.    screen dimensions as set by initwindow.  But suppose a different size is
  1513.    needed.  How can that be changed?  setvirtualsize controls the screen size.
  1514.    Here's an example:
  1515.  
  1516.      EXAMPLE 11:  Virtual window sizing
  1517.      ----------------------------------------------------------------------
  1518.      #include <conio.h>
  1519.      #include <dos.h>
  1520.      #include "wndwc20.h"
  1521.  
  1522.      void main()
  1523.      {
  1524.          initwindow( LIGHTGRAY_BG, 1, 0 );
  1525.          setwindowmodes( VIRTUALMODE );
  1526.          setvirtualsize( 20, 100 );              /* 20 rows by 100 columns */
  1527.          makewindow( 5, 20, 15, 40, LIGHTCYAN+BLUE_BG, WHITE+BLUE_BG,
  1528.                      SINGLE_BORDER, WINDOW1 );
  1529.          writetovirtual( WINDOW1 );     /* Now write to the virtual screen */
  1530.          qfill(1,1,crt_rows,crt_cols,SAMEATTR,'?');  /* Fill screen w/data */
  1531.          titlewindow( TOP, LEFT, YELLOW+BLUE_BG, " Virtual Window " );
  1532.          wwrite( 4, 8, " >" );                  /* Let's get our bearings. */
  1533.          qwriteeos( tws.wndwattr+BLINK, "+" );
  1534.          qwriteeos( SAMEATTR, "<- Row 4, Column 10 " );
  1535.          vupdatewindow();         /* Update the complete window on the CRT. */
  1536.          delay (4000);            /* Make sure we see where the cursor is. */
  1537.          removewindow();
  1538.          getch();
  1539.      }
  1540.  
  1541.    Notice that we chose a 20x100 screen, but what is seen on the CRT is only
  1542.    15x40 which is set by makewindow.  So, makewindow sets the view size while
  1543.    setvirtualsize sets the screen size.
  1544.  
  1545.    Writing to the Screen - Since there are two areas to write on a virtual
  1546.    window, the view and the screen, WNDWC must be told where you intend to
  1547.    place text.  Right after this makewindow function, it is assumed we are
  1548.    going to continue to write on the CRT.  But the primary place to write is
  1549.    the virtual screen.  writetovirtual selects that screen.  All subsequent
  1550.    functions will write to it - all QWIKC routines, WNDWC routines, and even
  1551.    titlewindow and makewindow.  It is treated just like any other screen.  The
  1552.    exception of course is the cursor routines which must be handled by WNDWC
  1553.    routines only.
  1554.  
  1555.    RELMODE - If you do write to the virtual screen and use makewindow, the
  1556.    mode is forced into RELMODE.  Otherwise, the window would be nested and
  1557.    WNDWC could not support it.
  1558.  
  1559.    Memory - What does the screen actually look like in memory?  It is saved in
  1560.    the heap in the same way as a CRT video screen.  Technically, the far
  1561.    pointer qscrptr points to the location of the screen which is a contiguous
  1562.    array of character/attribute words.  The last two rows past the screen are
  1563.    reserved for the virtual titles which are seen on the CRT view when
  1564.    updated.
  1565.  
  1566.  
  1567.  
  1568.    Chapter 5, Virtual Windows                                          Page 26
  1569.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1570.  
  1571.  
  1572.    Writing to the View - It is possible to write direct to the view on the CRT
  1573.    if desired.  To get back and write to the top view, use writetocrt and do
  1574.    your writing.  But the next time this window is updated with vupdatewindow
  1575.    or the like, the view will be overwritten with the contents of the virtual
  1576.    screen.
  1577.  
  1578.    Updating - At some time, we would probably like to see the screen and we
  1579.    can do this with any of five updating functions.  The main workhorse is
  1580.    vupdatewindow which has been demonstrated several times.  This function is
  1581.    so carefree it doesn't even matter when you use it.  It updates the virtual
  1582.    window of the current name (tws.wsname) no matter where it is - on top,
  1583.    covered, overlayed, and even hidden from the CRT!  The routine actually
  1584.    hunts for it and updates it.  To show how it can do this, let's modify the
  1585.    last example:
  1586.  
  1587.      EXAMPLE 12:  Updating covered windows automatically
  1588.      ----------------------------------------------------------------------
  1589.      #include <conio.h>
  1590.      #include <dos.h>
  1591.      #include "wndwc20.h"
  1592.  
  1593.      void main()
  1594.      {
  1595.          initwindow( LIGHTGRAY_BG, 1, 0 );
  1596.          setwindowmodes( VIRTUALMODE );
  1597.          setvirtualsize( 20, 100 );              /* 20 rows by 100 columns */
  1598.          makewindow( 5, 20, 15, 40, LIGHTCYAN+BLUE_BG, WHITE+BLUE_BG,
  1599.                      SINGLE_BORDER, WINDOW1 );
  1600.          setwindowmodes( 0 );                    /* Back to default modes. */
  1601.          makewindow( 7, 30, 16, 18, WHITE+GREEN_BG, GREEN_BG, DOUBLE_BORDER,
  1602.                      WINDOW2 );
  1603.          delay( 2000 );           /* Make sure we see where the cursor is. */
  1604.          writetovirtual( WINDOW1 );     /* Now write to the virtual screen */
  1605.          qfill(1,1,crt_rows,crt_cols,SAMEATTR,'?');  /* Fill screen w/data */
  1606.          titlewindow( TOP, LEFT, YELLOW+BLUE_BG, " Virtual Window " );
  1607.          wwrite( 4, 8, " >" );                  /* Let's get our bearings. */
  1608.          qwriteeos( tws.wndwattr+BLINK, "+" );
  1609.          qwriteeos( SAMEATTR, "<- Row 4, Column 10 " );
  1610.          vviewrc( 4, 10 );
  1611.          vupdatewindow();        /* Update the complete window on the CRT. */
  1612.          delay( 1000 );
  1613.          removewindow();
  1614.          delay( 2000 );           /* Make sure we see where the cursor is. */
  1615.          removewindow();
  1616.          getch();
  1617.      }
  1618.  
  1619.    With the delay inserted, it gives you time to clearly see that the covered
  1620.    virtual window was updated even though it was covered by another window.
  1621.    But that's not all.  When the window was removed, you could see that it was
  1622.    fully updated even under the part that was covered!  That's the power of
  1623.    virtual windows.
  1624.  
  1625.    Updating Routines - There are four other updating functions that can be
  1626.    chosen other than vupdatewindow:
  1627.  
  1628.  
  1629.    Chapter 5, Virtual Windows                                          Page 27
  1630.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1631.  
  1632.  
  1633.  
  1634.      vupdateview   - Updates just the window contents.
  1635.      vupdatetitles - Updates just the titles.
  1636.      vupdatecursor - Updates new cursor position.
  1637.      vupdaterows   - Updates selected rows on top view, but full view if
  1638.                      covered.
  1639.  
  1640.    vupdatewindow actually executes the first three.  But they are also
  1641.    available as separate routines for more detailed work.  When the view is on
  1642.    top of the CRT or hidden, the routines are extremely quick.  vupdaterows is
  1643.    especially quick for items like data entry to the virtual screen.  If the
  1644.    windows are covered, the functions have to do more work.  Then
  1645.    vupdatewindow takes about the same time as either vupdatetitles and
  1646.    vupdateview, so vupdatewindow might as well be used.  vupdatecursor is
  1647.    almost a trivial routine in any case.
  1648.  
  1649.    Viewing - In this example, you may have noticed that the view was shifted a
  1650.    bit compared to Example 11, and that the cursor was no longer in view.  It
  1651.    was shifted by the viewing routine vviewrc.  In fact, we could view any
  1652.    part of the screen.  Three routines can adjust the reference point of view
  1653.    of the upper left corner:
  1654.  
  1655.      vviewrc     - Changes to a given (row,col).
  1656.      vviewrcrel  - Shifts a number of rows and columns, positive or negative.
  1657.      vscrollview - Shifts a number of rows and columns, and updates just the
  1658.                    view and accepts mouse stepped input.
  1659.  
  1660.    The first two only change the coordinates in the virtual window record,
  1661.    while vscrollview updates the view as well.  vviewrcrel is actually a
  1662.    subroutine of vscrollview.  All routines check for bounds and will keep the
  1663.    view within screen limits.
  1664.  
  1665.    Resizing - If the virtual window is the top view, two routines can resize
  1666.    it by shifting the lower right hand border:
  1667.  
  1668.      vresizewindow - Shifts a number of rows and columns, and updates the
  1669.                      entire window.  Accepts both row and column parameters
  1670.                      which permit mouse stepped input.
  1671.      vzoomwindow   - Toggles window between full size and current size.
  1672.                      Zooming up, the window is centered on the screen and the
  1673.                      view is at (1,1).  Zooming down, it returns to the same
  1674.                      size and location, but the view remains at (1,1).
  1675.  
  1676.    Both routines force writing to the CRT upon exit.  They also completely
  1677.    update the window since the view and cursor may be shifted.  The titles are
  1678.    also smoothly updated.  The zoom can be toggled back and forth as long as
  1679.    it hasn't changed size or hasn't zoomed up another window.
  1680.  
  1681.  
  1682.  
  1683.  
  1684.  
  1685.  
  1686.  
  1687.  
  1688.  
  1689.  
  1690.    Chapter 5, Virtual Windows                                          Page 28
  1691.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1692.  
  1693.  
  1694.    6.  W I N D O W   M A N A G E M E N T
  1695.  
  1696.    Some of the previous examples have already touched on the principles of
  1697.    window management.  Now this section provides the full scope of management
  1698.    to access windows for display or writing, including multiple video pages.
  1699.  
  1700.  
  1701.    ACCESS METHODS
  1702.  
  1703.    The are two basic methods for accessing windows: serial access and random
  1704.    access; WNDWC does them both.
  1705.  
  1706.    Serial Access - This is a simple method of stacking windows over each other
  1707.    and then removing them in reverse order.  Any writing is always done on the
  1708.    top window displayed on the CRT.  The only two functions used are
  1709.    makewindow and removewindow.  For simple menu systems, serial access may be
  1710.    all that is needed.  The advantages are:
  1711.  
  1712.      . Uses less code.
  1713.      . No gaps in heap memory.
  1714.      . Only one place to write.
  1715.  
  1716.    But the disadvantages are many.  Once a window is removed, it is lost from
  1717.    memory and must be recreated.  This can cause a significant amount of
  1718.    shuffle to access other windows.  Serial access is a subset of random
  1719.    access.
  1720.  
  1721.    Random Access - More and more applications require access to any window at
  1722.    any time without losing the data.  WNDWC was designed to handle this
  1723.    automatically at very high speed.  The advantages to random access are:
  1724.  
  1725.      . Free access to any window.
  1726.      . Windows are created only once.
  1727.      . Virtual windows can be updated even if covered.
  1728.      . Ease of programming.
  1729.  
  1730.    Any window can be randomly accessed, including fixed, virtual and hidden
  1731.    windows.  It's as simple as that.  Try running the window management demo
  1732.    WNDWMGR.C again and see how you can hide, show, and access any window.
  1733.    The instructions are on the screen.
  1734.  
  1735.  
  1736.    DISPLAY CONTROL
  1737.  
  1738.    Three functions select the window to be displayed as the top window:
  1739.  
  1740.      accesswindow - Accesses the window by name whether hidden or covered.
  1741.      hidewindow   - Hides the top window.
  1742.      showwindow   - Shows a window given its name.
  1743.  
  1744.    accesswindow hunts for the named window and, if it is hidden, it will also
  1745.    be shown.  showwindow is actually a subroutine of accesswindow.  Any window
  1746.    (except PERMMODE) can be hidden and shown; they do not have to be created
  1747.    with HIDDENMODE which hides it at the start.
  1748.  
  1749.  
  1750.  
  1751.    Chapter 6, Window Management                                        Page 29
  1752.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1753.  
  1754.  
  1755.    EOS - When using hide/showwindow, the EOS is reset to (1,1) to prevent
  1756.    unexpected results.  However, if the window is currently displayed on the
  1757.    CRT and accesswindow is used, the EOS is restored to its previous value.
  1758.  
  1759.    removewindow - This function could be considered a form of display control,
  1760.    but remember that when a window is removed, it is gone forever, including
  1761.    any virtual screen.
  1762.  
  1763.    movewindow - This function shifts the top window around on the CRT by a
  1764.    given number of rows and columns allowing mouse stepped control.  A window
  1765.    can be limited in movement by setting the values in the structure called
  1766.    "margins" (see QWIKREF.DOC).  The bounds are conveniently checked, so the
  1767.    window will always stays within limits.  In the WNDWMGR.C demo, you can see
  1768.    the status line on row 25 is never overlapped by movewindow.  Although
  1769.    WINDOW0 is a permanent one, we could easily write to the status line at any
  1770.    time by using accesswindow(WINDOW0).
  1771.  
  1772.    Changing Borders - For human factors, it is often helpful to have a border
  1773.    be emphasized when it becomes the new top window.  Two high speed functions
  1774.    handle this well:
  1775.  
  1776.      changeborder  - Changes the top window to the new given border style.
  1777.      restoreborder - Restores the original border created with makewindow.
  1778.  
  1779.    Both of these functions work only on the top window, and they can either be
  1780.    fixed or virtual.  They replace all border parts including tees and also
  1781.    leave all titles untouched.
  1782.  
  1783.  
  1784.    WRITE CONTROL
  1785.  
  1786.    Three functions select where the writing functions will write:
  1787.  
  1788.      writetohidden  - Writes to the named hidden window.
  1789.      writetovirtual - Writes to the named virtual screen.
  1790.      writetocrt     - Writes to the current top window on the CRT.
  1791.  
  1792.    writetohidden - A hidden window is saved with the border intact, but is
  1793.    stripped of any shadow.  It is easier to use the window-relative writing
  1794.    routines because of the optional border rather than using QWIKC which can
  1795.    still be used.  Any shadow is reconstructed by showwindow.
  1796.  
  1797.    writetovirtual - A virtual screen can freely use either WNDWC or QWIKC
  1798.    routines since it never has a border.  If you want to write directly to the
  1799.    virtual screen after it has just been created, sometimes it's easier to use
  1800.    writetovirtual(tws.wsname) provided HIDDENMODE was not used as well.
  1801.  
  1802.    writetocrt - All routines continue to write to their destination until
  1803.    changed.  This routine will get you back to writing on the CRT.  Some
  1804.    functions are forced back to the CRT after their operation.  Here are those
  1805.    exceptions:
  1806.  
  1807.      accesswindow           vresizewindow         movewindow
  1808.      hidewindow             vzoomwindow
  1809.      showwindow             changeborder
  1810.  
  1811.  
  1812.    Chapter 6, Window Management                                        Page 30
  1813.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1814.  
  1815.  
  1816.      removewindow           restoreborder
  1817.  
  1818.    REMEMBER: Use writetocrt to get back to the CRT.  If you forget, the text
  1819.    will of course be in an unexpected window.
  1820.  
  1821.    makewindow - This function does NOT force a change in the write
  1822.    destination.  If you are writing to a hidden window or a virtual screen,
  1823.    the resulting window created by makewindow is forced into RELMODE.
  1824.    However, the windowmodes setting is not affected.
  1825.  
  1826.  
  1827.    WINDOW MODES AND FLAGS
  1828.  
  1829.    Additional window modes are available to restrict window operations or to
  1830.    detect the window destination status.  Each mode has a corresponding
  1831.    boolean flag.
  1832.  
  1833.    Restrictive Modes - In some applications, you may want to restrict what the
  1834.    end user can change for the windows.  Before the window is created with
  1835.    makewindow, use these modes in a call to setwindowmodes.  The flags can be
  1836.    used for testing.
  1837.  
  1838.      Set Mode      Set Flag      Description
  1839.      ------------  ------------  --------------------------------------------
  1840.      nohidemode    nohideflag    Ignores hidewindow operation.
  1841.      noaccessmode  noaccessflag  Ignores accesswindow operation.
  1842.      nomovemode    nomoveflag    Ignores movewindow/vresizewindow operations.
  1843.  
  1844.  
  1845.    Destination Modes - These modes are just for your information and are
  1846.    handled automatically by WNDWC.  These identify the write destination of
  1847.    the window.  You can use the flags for testing, but the modes are ignored
  1848.    by setwindowmodes:
  1849.  
  1850.      Set Mode       Set Flag       Description
  1851.      -------------  -------------  ------------------------------
  1852.      tocrtmode      tocrtflag      Writing to the CRT.
  1853.      tohiddenmode   tohiddenflag   Writing to the hidden window.
  1854.      tovirtualmode  tovirtualflag  Writing to the virtual screen.
  1855.  
  1856.  
  1857.    HIGH SPEED SCREEN DESIGN
  1858.  
  1859.    By using hidden or virtual windows, WNDWC enables you to make screen design
  1860.    several magnitudes faster than you ever thought possible.
  1861.  
  1862.    Comparing Speeds - Let's compare three speeds - (1) Turbo C's direct video,
  1863.    (2) QWIKC/WNDWC writing to CRT, and (3) QWIKC/WNDWC writing to RAM.  The
  1864.    following chart is striking.
  1865.  
  1866.                         ---- QWIKC/WNDWC ----
  1867.      Video Card  Turbo C   To CRT    To RAM
  1868.      ----------  -------   ------  ----------
  1869.      CGA         100%      225%    1600-4100%
  1870.      All others  100%      750%     900-1700%
  1871.  
  1872.  
  1873.    Chapter 6, Window Management                                        Page 31
  1874.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1875.  
  1876.  
  1877.  
  1878.    Design Strategy - So how can you get these fantastic speeds?  The simplest
  1879.    way was shown in Example 3 by creating hidden windows.  You may wish to
  1880.    make a habit of creating your windows with HIDDENMODE and then immediately
  1881.    show them with showwindow.  Virtual window code is not even required for
  1882.    hidden windows.  Of course, the alternative is to go ahead and use virtual
  1883.    windows.  Either way, you can actually see the increase in performance in
  1884.    your programs.
  1885.  
  1886.    Code Savings - Many application programs use disk-based screens that are
  1887.    called from the disk when required.  QWIKC and WNDWC require such little
  1888.    code to create a full screen design, that you will actually save code and
  1889.    disk space by using these routines - not to mention the increase in speed!
  1890.  
  1891.  
  1892.    MULTIPLE VIDEO PAGES
  1893.  
  1894.    Most color video cards have the capacity for multiple video pages.  If your
  1895.    application can benefit from extra pages, WNDWC handles all the data
  1896.    records with simplicity.
  1897.  
  1898.    Compiling - To add in the multiple video page code when compiling, you must
  1899.    define the macro MULTIPAGE.  The distributed library, WNDWC20S.LIB, has the
  1900.    multi-page code included.  If you have the source code, the macro is found
  1901.    at the top of WNDWC20.H.  To eliminate the code when these pages are not
  1902.    needed, simply comment out the "#define MULTIPAGE" statement.
  1903.  
  1904.    Changing Pages - To change video pages, use one of the following functions:
  1905.  
  1906.      writetopage      - Directs all QWIKC and WNDWC routines to write to the
  1907.                         given page number, but still view the current page.
  1908.      writeandviewpage - Directs all QWIKC and WNDWC routines to write and to
  1909.                         view the given page number.
  1910.  
  1911.    Separate Records - Each video page has its own set of window records that
  1912.    are completely separate including the level indexes and top window stats.
  1913.    So when pages are swapped, everything is just where it was left - even the
  1914.    cursor mode and EOS.  However, the virtual screen records use the same
  1915.    array in the heap, but, to keep them separate, they do not share records.
  1916.  
  1917.  
  1918. |  MULTI-TASKING ENVIRONMENTS
  1919. |
  1920. |  WNDWC is perfectly suited for working in multi-tasking environments.  In
  1921. |  order for your program to advantage of the speed and flexiblity of virtual
  1922. |  video buffers (MTVB) used with any environment, there is only one variable
  1923. |  that needs to be set:
  1924. |
  1925. |    prefer_multitask = 1;
  1926. |
  1927. |  Place this before initwindow, and WNDWC will use the MTVB if available.
  1928. |  All routines will then be set to write directly to this buffer.  If
  1929. |  inmultask is 1, then WNDWC is using the MTVB.  directvideo is set to 0 by
  1930. |  WNDWC and you must likewise instruct the environment that the program is
  1931. |  capable of writing to the MTVB by telling it that is does not write direct
  1932.  
  1933.  
  1934.    Chapter 6, Window Management                                        Page 32
  1935.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1936.  
  1937.  
  1938. |  to the screen.  WNDWC is extremely fast and proves itself well in
  1939. |  environments!
  1940. |
  1941. |  Multiple Pages - Please remember that many multi-tasking environments do
  1942. |  not support more than one page.  Be sure the ones you are designing around
  1943. |  do support full page control.  WNDWC prevents the use of multiple pages
  1944. |  while using the MTVB by altering maxvalidpage in the initpages function.
  1945. |  If you have one that behaves properly and you have the source code to WNDW,
  1946. |  you can enable multiple page writing by modifying initpages.
  1947.  
  1948.  
  1949.  
  1950.  
  1951.  
  1952.  
  1953.  
  1954.  
  1955.  
  1956.  
  1957.  
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963.  
  1964.  
  1965.  
  1966.  
  1967.  
  1968.  
  1969.  
  1970.  
  1971.  
  1972.  
  1973.  
  1974.  
  1975.  
  1976.  
  1977.  
  1978.  
  1979.  
  1980.  
  1981.  
  1982.  
  1983.  
  1984.  
  1985.  
  1986.  
  1987.  
  1988.  
  1989.  
  1990.  
  1991.  
  1992.  
  1993.  
  1994.  
  1995.    Chapter 6, Window Management                                        Page 33
  1996.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  1997.  
  1998.  
  1999.    7.  D A T A   M A N A G E M E N T
  2000.  
  2001.    Almost all of the data is handled automatically by WNDWC.  This section is
  2002.    provided for those who are interested in the details of data management and
  2003.    the inner workings of WNDWC.  The only required reading is Data Allocation.
  2004.    Otherwise, you can skip this section.
  2005.  
  2006.  
  2007.    DATA ALLOCATION
  2008.  
  2009.    This topic will provide you enough knowledge to budget the number of data
  2010.    records needed for your program using the macros MAXWINDOW,
  2011.    MAXVIRTUALWINDOW, and MAXPAGEUSED.
  2012.  
  2013.  
  2014.    Data Structure - For a detailed description of the data structure, you can
  2015.    refer to Data Structure in Section 3 of WNDWREF.DOC.  To be able to adjust
  2016.    the data structure, you must have the source code.  If not, the sizes have
  2017.    been preassigned.
  2018.  
  2019.    MAXWINDOW - Each window on the CRT, displayed or hidden, requires one index
  2020.    of the window statistics array (wndwstat), which is static data.  The
  2021.    initial window, WINDOW0, is always at wndwstat[0].  The size of the array
  2022.    of structures (wndwstat) is defined by MAXWINDOW as the highest number of
  2023.    windows, hidden and displayed, that are on the CRT at any one time on any
  2024.    one video page.   For example, if page 0 has a maximum of 10 windows and
  2025.    page 1 has 6, set MAXWINDOW equal to 10.
  2026.  
  2027.    MAXVIRTUALWINDOW - Each virtual window has two window structures - one is
  2028.    in wndwstat for the view and the other is in virtualstat for the virtual
  2029.    screen which is dynamic data.  The first virtual screen is saved in
  2030.    virtualstat[0] since it is zero based.  The array of records is sized by
  2031.    MAXVIRTUALWINDOW as the highest total number of active virtual windows.
  2032.    For example, if page 0 has 4 virtual windows and page 1 also has 4, set
  2033.    MAXVIRTUALWINDOW equal to 7 (not 8).
  2034.  
  2035.    MAXPAGEUSED - This is the highest page number that will be used in a
  2036.    multiple video page program.  If you are only using page 0, which is
  2037.    usually the case, you should go ahead and comment out the definition of the
  2038.    macro MULTIPAGE and not bother with MAXPAGEUSED.  Each page saves its own
  2039.    wndwstats and indexes in one structure called pagestat in an array in
  2040.    dynamic memory.  MAXPAGEUSED and maxpage are compared and the lesser of the
  2041.    two will size the pagestat array.
  2042.  
  2043.    Program Development - When you first start developing a program, make it
  2044.    easy on yourself and inflate the values of these macros to provide enough
  2045.    freedom without having to recompile.  In your final program, you can trim
  2046.    them down and retest.
  2047.  
  2048.  
  2049.    STRUCTURE HANDLING
  2050.  
  2051.    If you are wondering where your wndwstat structure is being saved, the
  2052.    following will show you how it is managed.
  2053.  
  2054.  
  2055.  
  2056.    Chapter 7, Data Mangement                                           Page 34
  2057.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  2058.  
  2059.  
  2060.  
  2061.    Displayed Stack - Each window as it is displayed on the CRT has its
  2062.    corresponding window structure saved in wndwstat starting from the bottom
  2063.    of the array and stacked upward.  The base window, WINDOW0, which is
  2064.    permanent, is saved in wndwstat[0].  The first window displayed is saved in
  2065.    wndwstat[1], the second in wndwstat[2], and so on.  The top window is in
  2066.    wndwstat[li] where li is the top Level Index.
  2067.  
  2068.    Hidden Stack - Hidden windows have their structure moved from wndwstat[li]
  2069.    to the top of wndwstat starting from the top of the array stacked downward.
  2070.    As you can imagine, the hidden stack is simply inverted to the displayed
  2071.    stack.  So, when a window is hidden, it is placed starting at
  2072.    wndwstat[MAXWINDOW].  The last hidden window saved is at wndwstat[hli].
  2073.    hli is the Hidden Level Index.  Conversely, when a window is shown, it is
  2074.    removed from the hidden stack and replaced in wndwstat[li].
  2075.  
  2076.    Random Access - Anytime a window is randomly accessed, the structure is
  2077.    pulled out from the middle of the stack.  The stack is then dropped to fill
  2078.    the gap.
  2079.  
  2080.    virtualstat - The structures for the virtual screens are kept in dynamic
  2081.    memory in an array called virtualstat and are not shuffled like the window
  2082.    structures.  If a window is virtual, the index to the virtual screen is
  2083.    wndwstat[?].vi.
  2084.  
  2085.    topwndwstat - The current window stats are always maintained in the global
  2086.    structure topwndwstat (tws).  When working with the current window, always
  2087.    use topwndwstat (tws) in lieu of wndwstat or virtualstat.
  2088.  
  2089.    topvirtualstat - Just like tws, a copy of the current virtual screen
  2090.    structures from virtualstat is maintained in the global structure
  2091.    topvirtualstat (tvs).
  2092.  
  2093.    RELMODE Structures - RELMODE windows only have the structure temporarily
  2094.    placed in tws and are not saved in the stack.  They are overwritten with
  2095.    any change of windows.
  2096.  
  2097.    PERMMODE Structures - PERMMODE windows have a copy of their structures
  2098.    placed in tws (and tvs if virtual), but the stack is not shuffled and there
  2099.    are no gaps.  All PERMMODE structures must be the first ones in the stack.
  2100.    The highest index of permanent windows is maintained in pli, the Permanent
  2101.    Level Index.
  2102.  
  2103.    Saving structures - Again, WNDWC handles this automatically, tws and tvs
  2104.    are saved in their appropriate wndwstat or virtualstat.  Remember, when
  2105.    writing to virtual screens, tws and tvs are reversed.  It may be helpful to
  2106.    think of tvs then as the Top View Stat on the CRT.
  2107.  
  2108.    Finding structures - Since the structures are shuffled, just how do you
  2109.    find the structure you want?  Given the window name, getlevelindex returns
  2110.    the index in wndwstat for the window structure.
  2111.  
  2112.    Page Structures - When swapping pages, WNDWC swaps the entire wndwstat
  2113.    array, top window structures, indexes, margins, cursor mode and window
  2114.    modes for each page.
  2115.  
  2116.  
  2117.    Chapter 7, Data Mangement                                           Page 35
  2118.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  2119.  
  2120.  
  2121.  
  2122.    Heap - Virtual screens and hidden windows are saved in the far heap.  To
  2123.    calculate your heap requirement, please refer to Appendix A in WNDWREF.DOC.
  2124.    For your own program, you can also use the heapok function to test for
  2125.    coreleft.  If there is insufficient heap space, then heapok will terminate
  2126.    the program using the GOOF module.
  2127.  
  2128.    Stack - The WNDWC modules were compiled with stack checking turned off, and
  2129.    the stack size left at Turbo C's default value, which is 4K.  Less than 2k
  2130.    of stack space is used in any function.
  2131.  
  2132.  
  2133.  
  2134.  
  2135.  
  2136.  
  2137.  
  2138.  
  2139.  
  2140.  
  2141.  
  2142.  
  2143.  
  2144.  
  2145.  
  2146.  
  2147.  
  2148.  
  2149.  
  2150.  
  2151.  
  2152.  
  2153.  
  2154.  
  2155.  
  2156.  
  2157.  
  2158.  
  2159.  
  2160.  
  2161.  
  2162.  
  2163.  
  2164.  
  2165.  
  2166.  
  2167.  
  2168.  
  2169.  
  2170.  
  2171.  
  2172.  
  2173.  
  2174.  
  2175.  
  2176.  
  2177.  
  2178.    Chapter 7, Data Mangement                                           Page 36
  2179.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  2180.  
  2181.  
  2182.    8.  O T H E R   M O D U L E S
  2183.  
  2184.    Besides the actual WNDWC code, we have included a few other modules as part
  2185.    of the WNDWC package. The GOOF module handles programming errors.  The
  2186.    other modules, as described below, have some high speed screamin' routines
  2187.    to add zing into many of the window operations.  These utility modules are
  2188.    part of the WNDWC library (.LIB) file, and you can use them in your
  2189.    programs.  See WNDWREF.DOC for information on using the utility functions.
  2190.  
  2191.  
  2192.    GOOF MODULE
  2193.  
  2194.    All programmers make mistakes, right?  So, what happens when you try to
  2195.    make more windows than there are indices available?  Since WNDWC is so
  2196.    powerful and can even write in RAM, there is a good possibility that your
  2197.    mistake may not even show up on the screen.  How do you know if anything
  2198.    has gone wrong?  The GOOF module was made especially for handling errors.
  2199.  
  2200.    Displaying Errors - When an error is found in your program, the function
  2201.    showgoof is called and the program is terminated.  The CRT will display an
  2202.    error message in a flashing window.  There are eight fatal errors that are
  2203.    listed in APPENDIX B in WNDWREF.DOC to identify problems before they
  2204.    happen.  Please refer to it for the error messages and their solutions.
  2205.  
  2206.    Flexibility - You can edit GOOF for use in your own applications.  After
  2207.    customizing the module, use the TLIB command to replace it in the
  2208.    appropriate WNDWC library.  Then when the library is linked with your
  2209.    program, your new GOOF module can be called.  The error message numbers
  2210.    1-50 are reserved.  So, for your own applications, it is suggested that you
  2211.    start with number 51.  If you have thoroughly tested your program, some of
  2212.    the messages can be eliminated.
  2213.  
  2214.  
  2215.    UTILITY MODULES
  2216.  
  2217.    To help make WNDWC into a fast library, some move and swap functions were
  2218.    placed in the WNDWC library.  If you wish, you may link the object files
  2219.    for them into programs of your own which do not already use the WNDWC
  2220.    library.
  2221.  
  2222.  
  2223.    move16/movewords - Since WNDWC needs the highest speed move functions, two
  2224.    routines were developed.
  2225.  
  2226.      move16    - Replacement for memcpy or memmove, but twice as fast using
  2227.                  16-bit transfers,
  2228.      movewords - Faster than move16, but destination cannot overlap source[0].
  2229.  
  2230.  
  2231.  
  2232.  
  2233.  
  2234.  
  2235.  
  2236.  
  2237.  
  2238.  
  2239.    Chapter 8, Other Modules                                            Page 37
  2240.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  2241.  
  2242.  
  2243.    9.  C O M P I L I N G   T H E   S O U R C E   C O D E
  2244.  
  2245.    If you have registered for the source code, it's likely that you will want
  2246.    to compile it using various model sizes and compiler options.  We have made
  2247.    this process easy.  Set up your options in the TC environment, save them in
  2248.    a .TC file, and convert it to TURBOC.CFG using TCCONFIG.  Then you can use
  2249.    the MAKEWNDW.BAT file provided to compile.  When running it, you must
  2250.    specify the letter for the model you wish to use.  For instance, to compile
  2251.    the source using the Compact Model, type:
  2252.  
  2253.      makewndw c
  2254.  
  2255.    Note: Turbo Assembler, MASM 4.0, or a compatible assembler must be
  2256.    accessible via the DOS path in order for MAKEWNDW.BAT to work.
  2257.  
  2258.    The MAKEWNDW.BAT file compiles the WNDWC modules, then adds them to the
  2259.    library (.LIB) file for the model you requested.  For instance, if you
  2260.    specified the Medium Model, the modules would be placed in WNDWC20M.LIB.
  2261.  
  2262.    The optimum settings for compiling WNDWC are as follows:
  2263.  
  2264.      Floating point:        None
  2265.      Test stack overflow:   Off
  2266.      Line numbers:          Off
  2267.      OBJ debug information: Off
  2268.      Optimize for:          Speed
  2269.  
  2270.    The following settings are mandatory:
  2271.  
  2272.      Model:                 Small-Huge (Tiny not supported)
  2273.      Calling convention:    C
  2274.      Standard stack frame:  On
  2275.      Identifier length:     32 (or above)
  2276.  
  2277.  
  2278.  
  2279.  
  2280.  
  2281.  
  2282.  
  2283.  
  2284.  
  2285.  
  2286.  
  2287.  
  2288.  
  2289.  
  2290.  
  2291.  
  2292.  
  2293.  
  2294.  
  2295.  
  2296.  
  2297.  
  2298.  
  2299.  
  2300.    Chapter 9, Compiling the Source Code                                Page 38
  2301.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  2302.  
  2303.  
  2304.    A P P E N D I X   A :   A P P L I C A T I O N   P R O D U C T S
  2305.  
  2306.  
  2307.    Eagle Performance Software has developed identical products for both Turbo
  2308.    C and Turbo Pascal.  Our pledge is to provide you quality products with
  2309.    unparalleled performance and ease of use.  All registered users receive the
  2310.    complete source code when a signed license agreement is returned.
  2311.  
  2312.  
  2313.    QWIK
  2314.  
  2315.    QWIK - For direct screen video, QWIK is the highest performance screen
  2316.    writing tools available today for all text modes in any video
  2317.      configuration.  QWIK provides capabilities far beyond those in the
  2318.      unit/library that comes with your compiler.   Here are some of the
  2319.      features:
  2320.  
  2321.      - Writes on all IBM compatible computers, displays and adapters
  2322.        including MDA, CGA, EGA, MCGA, VGA, 8514/A, Hercules and 3270 PC.
  2323.      - Superior video detection routine.
  2324.      - Eliminates snow and flicker.
  2325.      - Writes directly to the screen in absolute rather than relative
  2326.        coordinates.
  2327.      - Writes in all text modes and column modes.
  2328.      - Writes on all video pages.
  2329.      - Writes on virtual screens in RAM.
  2330.      - Writes text and attribute, text only, or attribute only.
  2331.      - Reads strings, characters and attributes.
  2332.      - Uses End-Of-String (EOS) marker for quick string chaining.
  2333.      - Provides standardized cursor shapes for all adapters.
  2334.      - Enhanced cursor movement.
  2335.      - Compatible with DESQview and similar multitasking environments.
  2336.      - Over 650% faster than standard direct screen writing.
  2337.      - Only 2.7k bytes of code if all 43 utilities are used.
  2338.      - Optimized by the compiler/linker and drops unused code.
  2339.      - Used in all other Eagle products.
  2340.      - Excellent documentation like this document.
  2341.  
  2342.    Here are the product versions:
  2343.  
  2344.  
  2345.       File name    CIS Name    Compiler  Release date
  2346.       -----------  ----------  --------  ------------
  2347.       QWIK42B.ARC  QWIK42.ARC  TP4(TP5)   10-01-88
  2348.       QWIK5X.ARC   QWIK5X.ARC  TP5(TP4)   12-20-88
  2349.       QWIKC20A.ARC QWKC20.ARC  TC2        12-03-88
  2350.  
  2351.  
  2352.    WNDW - Here are the current product versions of WNDW:
  2353.  
  2354.       File name    CIS Name    Compiler  Release date
  2355.       -----------  ----------  --------  ------------
  2356.       WNDW42.ARC   WNDW42.ARC  TP4(TP5)   10-15-88
  2357.       WNDW5XA.ARC  WNDW5X.ARC  TP5(TP4)   12-20-88
  2358.       WNDWC20.ARC  WNDC20.ARC  TC2        02-01-89
  2359.  
  2360.  
  2361.    Appendix A: Application Products                                    Page 39
  2362.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  2363.  
  2364.  
  2365.  
  2366.  
  2367.    PULL
  2368.  
  2369.    PULL - For multi-level pull-down menus, PULL is fully featured and fully
  2370.    configurable.  Includes execute, single, and multiple choice menus,
  2371.    unlimited nested submenus, data entry windows, help windows, directory
  2372.    windows, message system, and fully completed interfaces.  Some of the
  2373.    features are:
  2374.  
  2375.      - Uses QWIK and WNDW.
  2376.      - Work window(s) and complete interface for menus
  2377.      - Pull-down menus with 3 menu modes and 7 line modes
  2378.      - Pull-down file directory
  2379.      - Highlighted command letters
  2380.      - Unlimited levels of submenus
  2381.      - Unlimited data entry windows for 9 types of data
  2382.      - Data entry for the work window(s)
  2383.         Free field entry with either fixed column or flexible column
  2384.          length.
  2385.         Full editing capability including insert cursor mode
  2386.         Full field selection with cursor keys
  2387.         Automatic NumLock for numerical data entry
  2388.         Right or left justification for data entry output
  2389.         Error messages for invalid data entries
  2390.         Error messages for data entries out of range
  2391.      - Automatic sizes and locations for menus.
  2392.      - Operation by cursor keys or command keys
  2393.      - Pull/Pop between work window and nested submenu(s)
  2394.      - Programmable control of pull and pop sequences
  2395.      - Context-sensitive help
  2396.      - Message lines for prompts and processing
  2397.      - Full working shell for user development
  2398.      - Excellent documentation like this document.
  2399.  
  2400.    Here are the product versions:
  2401.  
  2402.       File name    CIS Name    Compiler  Release date
  2403.       -----------  ----------  --------  ------------
  2404.       PULL42.ARC   PULL42.ARC  TP4(TP5)   01-03-89
  2405.       PULL5XA.ARC  PULL5X.ARC  TP5(TP4)   01-06-89
  2406.       PULLC20.ARC  PULC20.ARC  TC2        TBA
  2407.  
  2408.  
  2409.    ON-LINE SERVICES
  2410.  
  2411.    CompuServe - All updated files and later versions can be found on the
  2412.    CompuServe Borland Forums (GO BPROGA for TP and GO BPROGB for TC) or the
  2413.    IBM Programming Forum (GO IBMPRO).
  2414.  
  2415.    The Eagle BBS - You can also get the latest files on our 24-hour BBS at
  2416.    (214) 539-9878, 1200/2400 N81.
  2417.  
  2418.  
  2419.  
  2420.  
  2421.  
  2422.    Appendix A: Application Products                                    Page 40
  2423.    WNDWC Multi-level Virtual Windows                User's Guide, Version 2.0
  2424.  
  2425.  
  2426.    A P P E N D I X   B :   C R E D I T S
  2427.  
  2428.  
  2429.    Fundamental Ideas - The initial concepts of serial-access windows were
  2430.    developed by Michael Burton in his copy of WINDO.INC, ver 2.4.  The
  2431.    concepts were used by written permission.
  2432.  
  2433.    Special Effects - Special effects concepts were graciously suggested by
  2434.    Rick Fothergill.
  2435.  
  2436.    Copyright (c) 1989 by James H. LeMay for Eagle Performance Software.
  2437.    All Rights Reserved.  Protected by the United States Copyright Laws.
  2438.    Conversion to Turbo C by Jordan Gallagher / Wisdom Research
  2439.  
  2440.  
  2441.  
  2442.  
  2443.  
  2444.  
  2445.  
  2446.  
  2447.  
  2448.  
  2449.  
  2450.  
  2451.  
  2452.  
  2453.  
  2454.  
  2455.  
  2456.  
  2457.  
  2458.  
  2459.  
  2460.  
  2461.  
  2462.  
  2463.  
  2464.  
  2465.  
  2466.  
  2467.  
  2468.  
  2469.  
  2470.  
  2471.  
  2472.  
  2473.  
  2474.  
  2475.  
  2476.  
  2477.  
  2478.  
  2479.  
  2480.  
  2481.  
  2482.  
  2483.    Appendix B: Credits                                                 Page 41
  2484.